如何在不丢失所有提交历史记录的情况下将存储库迁移到 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.
之间复制数据
我有一个现有的 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.
之间复制数据