git lfs迁移有什么作用?

时间:2018-08-10 08:19:07

标签: git git-lfs

我认为git lfs migrate重写了回购的历史记录,以便将指定的大文件保存在LFS中。这意味着存储库应该变小,因为它不直接包含大文件的所有版本。但是,当我跑步

git lfs migrate import --include="test-data/**" --include-ref=refs/heads/master

test-data/目录中的所有文件都替换为以下文件:

version https://git-lfs.github.com/spec/v1
oid sha256:5853b5a2a95eaca53865df996aee1d911866f754e6089c2fe68875459f44dc55
size 19993296

.git文件夹变成两倍大(400MB至800MB)。我很困惑。什么是git lfs migrate doing

编辑:我做了clean after migration

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

在运行du之前。然后,这些文件夹将占用大部分空间:

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

3 个答案:

答案 0 :(得分:5)

唯一的问题是二进制文件的原始git对象仍然位于.git文件夹中,因为您没有对它们进行垃圾回收。

您应遵循git lfs migration tutorial的说明:

  

以上代码成功地将先前存在的git对象转换为lfs   对象。但是,常规对象仍保留在.git中   目录。这些将最终由git清理,但要清理   立即将它们运行:

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

运行后,您的.git应该具有相同的大小,但是如果您要使用它,则应该看到objects现在应该比迁移之前小得多,并且lfs拥有休息。

更好的消息是,现在其他开发人员/应用程序克隆存储库时,他们只需下载objects目录,然后仅获取 “大文件”即可他们查看的不是全部历史记录。

答案 1 :(得分:3)

  

我认为git lfs migration重写了一个repo的历史记录,以便将指定的大文件保存在LFS中。

完全正确。

  

这意味着存储库应该变小,因为它不直接包含大文件的所有版本。

并非完全正确。 git lfs的承诺不是您的仓库会更小,而是克隆时,您不必下载所有git对象,因此克隆会更小,更快。因为对于git-lfs管理的文件,在git checkout期间仅下载应该出现在您的工作目录中的文件。

  

test-data /目录中的所有文件都替换为以下文件:

这就是git-lfs的工作方式。而不是提交存储库中的文件,而是提交包含对象的ID的“指针”文件。文件的内容存储在.git/lfs/objects文件夹中。这些对象将在您git push上载到服务器。

  

.git文件夹变成两倍大(400MB至800MB)。我很困惑。

由于git lfs管理的所有文件都存储在此文件夹中,所以它可能会变得很大。 我还认为它使存储库的大小增加了一倍,因为对象暂时存储了两次。在.git/objects中,直到您放弃旧的历史记录为止(按purging the reflog and doing a git gc。但是,一旦确定您的lfs迁移成功,就执行此操作),然后在.git/lfs/objects中这样做,因为您进行了git lfs转换。

我认为(但不确定).git/lfs/objects用作缓存文件夹,因此一旦您推送了所有新历史记录并上载了lfs管理的文件,就可以删除它以减小大小您的存储库。 但是如果我是你,我不会那样做!

要查看git lfs对本地存储库的实际影响,一旦您--force推送了新的历史记录(并且旧的存储库不再位于远程存储库中),我将进行一个新的克隆。现在,您的本地存储库应该较小。

但是以后每次下载这些文件的新版本时,文件夹.git/lfs/objects仍会增加(但应始终比不使用git lfs时小)。

希望您能更好地了解它的工作原理...

PS:

  

test-data /目录中的所有文件都替换为以下文件:

我希望你所说的部分错误。 test-data/中的文件仍然包含良好的内容,但是您报告的是git命令向您显示的内容... 你能确认吗?或您有问题...可以通过未安装git lfs来解释。

答案 2 :(得分:0)

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

  • git lfs track命令之后。此命令将更改工作副本上所有已跟踪的“大文件”。
  • 未提交git lfs track命令对工作副本所做的所有更改。 如果您遵循了本教程并仅提交了.gitattributes,但并没有提交所有“大文件”,则可能会发生这种情况。