如何将repo迁移到git-lfs而不会丢失所有提交历史记录?

问题描述 投票:2回答:4

我有一个现有的git存储库,其中包含分散在多个文件夹中的大量“.bmp”文件。我想更新此存储库,以便使用Git-LFS。有没有办法在不丢失所有提交历史的情况下执行此操作?在搜索这个时,我遇到了一个工具BFG Repo-Cleaner。但是这个工具是否维护了所述存储库的提交历史记录?

git github git-lfs
4个回答
1
投票

我不知道你的意思是“保持提交历史”......

您必须知道git基于哈希(sha1)“密封”提交。如果提交的其中一个数据发生更改,则提交的sha1会更改。并且因为提交被链接,所有孩子的sha1也会提交更改。

因此,如果您强制推送BFG所做的更改,那么历史记录将会发生变化并且您将惹恼存储库的所有用户。

这就是为什么你应该三思而后行。但如果你认为是这样的话,那么......小心翼翼;-)


2
投票

我用过这个script。在其解释得很好的文章中,他们还列出了迁移回购的其他一些方法。对我来说,只要历史,作者,日期等相同,就可以改变sha-1值。因此,如果你不太关心sha-1值,那么这个脚本效果很好。


1
投票

(我使用TortoiseGit,因此可能会在幕后做一些允许这些步骤为我工作的事情。如果情况确实如此,请发表评论。)

如果您可以在旧的git存储库之间复制数据(这意味着保持提交历史记录不受影响),请执行以下操作:

  • 为您的仓库设置git lfs
  • 添加gitattribute *.bmp filter=lfs diff=lfs merge=lfs -text并提交此更改
  • 在文件资源管理器中,搜索所有.bmp文件并删除所有这些文件
  • 还原对工作副本的所有更改
  • 现在所有.bmp文件都应该显示为已修改,即使它们与旧存储库中的文件完全相同(修改实际上是对文件的属性更改,告知它要添加到git lfs,而不是对文件本身进行修改)
  • 提交这些更改。这会将所有.bmp文件推送到git lfs

您可能认为这没有意义,因为它只是复制旧git存储库和新git lfs之间完全相同的数据。如果你不想复制,你需要使用像问题中提到的BFG Repo-Cleaner之类的东西。

......但我们有一些问题意味着有必要在我们的回购中执行此过程。以下是我们为什么这样做的背景(我们可以通过重复来解决我们遇到的问题):

我们有一个现有的存储库,其中散布着大量的.png文件,类似于您的问题。我们开始在这个存储库中使用git lfs,并在*.png filter=lfs diff=lfs merge=lfs -text行中添加到我们的.gitattributes中。这意味着所有现有的.png文件都保留在我们的旧git存储库中,新文件被添加到我们的git lfs中。

...但是这导致了一个问题,即.png文件有时会显示为已修改(即使文件内容未被修改),因为它们的属性正在被更改。提交这些更改会将它们添加到git lfs,但它变得很麻烦,因为这些更改无法恢复,并且会阻止分支之间的轻松切换(未修改的文件需要在能够切换分支之前重新提交)。

要解决此问题,我们需要将所有.png文件迁移到git lfs而不修改提交历史记录,就像这个原始问题一样。使用我描述的过程是一种简单,安全且简单的方法来解决这种麻烦,代价是在旧的存储库git和新的git lfs之间复制数据。


0
投票

在这一点上这可能是显而易见的,但除了上面提到的@Frossy链接的script的巨大帮助之外,似乎有一个“最佳”选项来进行平均使用...请参阅git-lfs-migrate。就像我说的那样在这一点上可能是非常明显的,但是作为一个git-lfs noob,几天前它并没有给我,这个问题得到了很多点击。

另外,我刚刚在@Frossy脚本的底部看到,有一些提到git-lfs-migrate。

© www.soinside.com 2019 - 2024. All rights reserved.