git lfs migrate是什么?

26
我认为git lfs migrate会重写存储库的历史记录,以便将指定的大文件保存在LFS中。这意味着存储库应该变得更小,因为它不直接包含所有大文件的版本。但是,当我运行以下命令时:git lfs migrate import --include="test-data/**" --include-ref=refs/heads/mastertest-data/目录中的所有文件都被替换为类似于这样的文件:{{...}}
version https://git-lfs.github.com/spec/v1
oid sha256:5853b5a2a95eaca53865df996aee1d911866f754e6089c2fe68875459f44dc55
size 19993296

而 .git 文件夹的大小增加了一倍(从400MB到800MB)。我很困惑。git lfs migrate在做什么?

编辑:我已经清理迁移后的内容

git reflog expire --expire-unreachable=now --all
git gc --prune=now

在运行du命令之前,大部分空间被这些文件夹占用:

414M .git/objects 398M .git/lfs

3个回答

26
唯一的问题是二进制文件的原始git对象仍然在.git文件夹中,因为您没有进行垃圾回收。
您应该按照git lfs迁移教程的说明进行操作:

以上成功将现有的git对象转换为lfs对象。但是,常规对象仍然存在于.git目录中。这些对象最终将被git清理,但要立即清理它们,请运行:

git reflog expire --expire-unreachable=now --all
git gc --prune=now

运行完后,你的.git文件大小应该是一样的,但如果你进入它,你会发现objects文件夹比迁移之前要小得多,而lfs则包含剩余部分。更好的消息是,现在其他开发人员/应用程序克隆仓库时只需要下载objects文件夹,然后仅提取他们检出的“大文件”,而不是整个历史记录。

1
这个问题已经被标记为已回答,但是为什么呢?我也遇到了同样的问题,在迁移后也进行了清理。.git/lfs文件夹现在变得非常大,包含了所有的lobs。然而,.git/objects文件夹的大小仍然保持着之前的90%(几乎和存储所有BLOBs时一样大)。 - PasterOfMuppets
这对我很有帮助,教程也非常好。谢谢。 - iamakhilverma

7
我认为 git lfs migrate 重写了存储库的历史记录,以便将指定的大文件保留在 LFS 中。 完全正确。 这意味着存储库应该变得更小,因为它不直接包含所有版本的大文件。 不完全正确。git lfs 的承诺不是使存储库更小,而是当您克隆时,您不必下载所有 git 对象,因此克隆将更小更快。因为对于由 git-lfs 管理的文件,在 git checkout 期间仅会下载应出现在您的工作目录中的文件。 测试数据目录中的所有文件都被替换为看起来像这样的文件: 这就是 git-lfs 的工作原理。它不是在存储库中提交文件,而是提交一个包含对象 ID 的“指针”文件。文件的内容存储在 .git/lfs/objects 文件夹中。并且这些对象将在您执行 git push 时上传到服务器。 而 .git 文件夹变成了原来的两倍(从400MB变成了800MB)。我感到困惑。
由于git lfs管理的所有文件都存储在这个文件夹中,因此它可能变得非常庞大。我认为它会使您的存储库大小翻倍,因为对象目前存储了两次。在.git/objects中直到您通过清除reflog并执行git gc来放弃旧历史记录。但是,请确保您的lfs迁移成功后再执行此操作。同时,在.git/lfs/objects中也因为您进行了git lfs转换。我认为(但不确定).git/lfs/objects作为缓存文件夹,所以一旦您推送了所有新历史记录并上传了由lfs管理的文件,就可以将其删除以减小存储库的大小。但如果我是您,我不会这样做!要查看git lfs对本地存储库的实际影响,一旦您--force推送了新历史记录(旧历史记录已不在远程存储库中),请进行全新克隆。现在,您的本地存储库应该更小。
但是文件夹.git/lfs/objects每次下载这些文件的新版本时都会继续增长(但它应该始终比不使用git lfs更小)。
我希望您现在更了解它的工作原理...
附言:

test-data/目录中的所有文件都被替换为类似于此类文件:

我希望你所说的部分是错误的。您的test-data/中的文件仍然包含良好的内容,但您报告的是git命令显示的内容... 你能确认吗?或者您遇到了问题... 这可能是由于未安装git lfs引起的。

3
"我希望你所说的部分是不正确的。" 不,当我在文本编辑器中打开文件时,看到了提到的文本。 我想出了运行“git lfs pull”以将其替换为正确文件的方法。 - Mohan
1
我曾考虑过推送到另一个分支并重新克隆以检查空间使用情况,但我不能百分之百确定这样做不会产生任何副作用,所以我没有尝试。 - Mohan

1

当您进行迁移时,看起来像git lfs指针并替换了工作副本中的文件(在您的情况下是test-data/中的文件)的奇怪文件出现了。

  • 在执行git lfs track命令后会出现这些文件。此命令会更改工作副本上所有已跟踪的“大文件”。
  • 如果您按照教程只提交了.gitattributes,而没有提交所有“大文件”,则可能会出现此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接