如何在不丢失所有提交历史记录的情况下将存储库迁移到 git-lfs?

How to migrate a repo to git-lfs without losing all the commit history?

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

我不知道你说的 "maintain the commit history" 是什么意思...

您必须知道 git 是基于 "seal" 提交的哈希 (sha1)。如果提交的数据之一发生更改,则提交的 sha1 也会更改。并且因为提交是链接的,所以子项的所有 sha1 提交也会更改。

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

这就是为什么您应该三思而后行的原因。但是,如果您认为是,那就去做吧……小心 ;-)

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

这在这一点上可能很明显,但是除了@Frossy 的链接 script mentioned above...see git-lfs-migrate 中的巨大帮助之外,似乎还有一个 "best" 选项可以迁移到一般用途。就像我说的,这在这一点上可能是显而易见的,但作为一个 git-lfs 菜鸟,几天前我还不是这样,这个问题得到了很多点击。

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

(我使用 TortoiseGit,所以它可能在幕后做了一些事情让这些步骤对我有用。如果情况确实如此,请发表评论。)

如果您可以在旧 git 存储库之间复制数据(这意味着根据需要保持提交历史不变),请执行以下操作:

  • 为您的代码库设置 git lfs
  • 添加 git 属性 *.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 行中添加到我们的 .git 属性。这意味着所有现有的 .png 文件都保留在我们的旧 git 存储库中,而新文件已添加到我们的 git lfs。

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

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

之间复制数据