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

标签 git github git-lfs

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

最佳答案

(我使用 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 协议(protocol)上执行此过程。以下是我们这样做的背景(我们可以通过复制来解决我们遇到的问题):

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

关于git - 如何在不丢失所有提交历史记录的情况下将 repo 迁移到 git-lfs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34946134/

相关文章:

git - 如何计算日期范围内每个用户的 git 提交?

github - SonarQube 不对 GitHub 拉取请求发表评论

php - 使用 php-github-api 的 Github 身份验证

git - Homebrew 更新不断提示 git-lfs 但问题出在哪个 repo 协议(protocol)上

git - 创建 Git 标签时自动运行 Git 钩子(Hook)

git - TortoiseGit 找不到 git.exe

git - .gitignore文件中 `syntax: glob/regexp`是什么意思?

git - 个人账号可以在GitHub上建多少个公共(public)仓库?

windows - 如何在 Windows 上安装 Git Large File Storage?

git - 测量 git blob 对象大小的正确方法是什么