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

时间:2016-01-22 11:53:53

标签: git github git-lfs

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我不知道“维护提交历史”是什么意思......

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

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

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

答案 2 :(得分:1)

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

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

  • 为您的repo设置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之间复制数据。

答案 3 :(得分:0)

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

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

相关问题