2

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

4

4 回答 4

2

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

于 2016-02-08T10:45:49.157 回答
2

(我使用 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 之类的东西。

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

我们有一个现有的存储库,其中散布着大量 .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 之间复制数据。

于 2018-01-22T18:41:57.720 回答
1

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

您必须知道 git 基于“密封”提交的哈希(sha1)。如果提交的数据之一更改,则提交的 sha1 更改。并且由于提交是链接的,所有子项的 sha1 也提交更改。

结果,历史将会改变,如果你强制推送 BFG 所做的更改,你会惹恼存储库的所有用户。

这就是为什么你应该三思而后行。但是,如果您认为是,请谨慎行事;-)

于 2016-01-22T21:42:01.107 回答
0

这在这一点上可能很明显,但除了上面提到的@Frossy 链接脚本中的巨大帮助之外,似乎还有一个“最佳”选择来迁移以供平均使用......请参阅git-lfs-migrate。就像我说的那样,这在这一点上可能很明显,但作为一个 git-lfs 菜鸟,几天前对我来说并不是这样,这个问题得到了很多点击。

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

于 2017-09-08T18:41:53.030 回答