Git LFS和git-annex有什么不同?

79

git-annex 已经存在相当长的时间,但从未真正获得势头。
Git LFS 相对年轻,已经得到 GitHub、Bitbucket 和 GitLab 的支持。

这两个工具都处理 git 存储库中的二进制文件。然而,GitLab 似乎在一年内用 Git LFS 取代了 git-annex

  • 它们之间的技术差异是什么?
  • 它们是否解决同样的问题?

1
这里有一篇关于两者的非常好的文章:使用Git处理大文件:LFS和git-annex(LWN.net) - Niko Pasanen
2个回答

79

它们确实解决了相同的问题。

首先我会从正反两个方面讲,然后再进入技术上的区别。

git-annex

优点:

  • 支持多个远程仓库,您可以将二进制文件存储在其中。
  • 可以在不需要托管提供商的支持下使用(有关详细信息,请参见此处)。

缺点:

  • Windows支持还在测试阶段,已经有很长一段时间了。
  • 用户需要学习日常工作的不同命令。
  • 不受github和bitbucket支持。

git-lfs

优点:

  • 受到github、bitbucket和gitlab的支持。
  • 在所有操作系统中支持最广泛。
  • 易于使用。
  • 基于过滤器自动化。

缺点:

技术

git-annex

git-annex通过在您的存储库中创建符号链接来工作。实际数据存储在单独的后端(S3、rsync和其他许多)。它是用Haskell编写的。由于它使用符号链接,Windows用户被迫以更不同的方式使用annex,这使得学习曲线更高。

git-lfs

写入指针文件。使用git-lfs API将BLOBs写入lfs。由于此原因需要一个特殊的LFS服务器。Git LFS使用过滤器,因此您只需设置一次LFS,然后再次指定要推送到LFS的文件类型时就可以了。


很好的总结!我有两个问题。使用 git-annex 的 Windows 用户是否会失去一些功能?是否可以有多个 LFS 服务器(与 git-annex 中的多个后端类似)? - Stefanus
1
可能会有这样的情况,LFS 的工作原理非常类似于实际的 Git 服务器工作。您只需添加另一个远程仓库并将分支推送到两个远程仓库即可。 - grepsedawk
“基于过滤器自动化” 看起来git annex也可以做到同样的事情:https://git-annex.branchable.com/tips/largefiles/ - Rufflewind
如果有人想添加优缺点,我欢迎对这个列表进行任何修改。 - grepsedawk
1
本来准备使用git-lfs(因为我目前使用github托管我的代码库),但后来发现这些提供商的定价结构对于LFS存储库是不同的。可能需要每月支付至少5-10美元的费用,以获取包含任何大文件的存储库(虽然可能可以利用GitLab的免费10GB)。这对于行业用户来说并不是致命问题,但通常不适合旨在无限期发布的研究软件。 - Tom Close
显示剩余4条评论

53

Git Annex的一个主要优点是你可以选择想要下载的文件。

由于符号链接,您仍然知道哪些文件可用。

例如,假设您有一个充满ISO文件的目录。您可以列出文件,然后通过输入以下命令来决定要下载哪个文件:git annex get my_file.

另一个优点是文件不会在您的checkout中重复。使用LFS,lfs文件既存在于.git/lfs/objects中的git对象中,也存在于您的工作库中。因此,如果您有20GB的LFS文件,则需要40GB的磁盘空间。而对于git annex,文件是通过符号链接实现的,所以在这种情况下只需要20GB。


1
谢谢您的回答!我仍在努力理解这些事情,但是使用GVFS(https://github.com/Microsoft/gvfs)与git / git-lfs配对是否可以解决下载单个文件的问题。从他们的自述文件中可以看到...“ GVFS虚拟化了git repo下面的文件系统,以便git和所有工具看到似乎是正常的repo,但是GVFS只在需要时下载对象” - Vivek Gani
2
GVFS目前似乎只支持Windows操作系统。 - Karl Forner
17
谢谢提及LFS的数据复制问题,我在其他地方没有看到过这个问题被提到。我不想因为没有好的理由而重复使用我的媒体目录磁盘空间。 - Ragnar
我发现Lee Hinman的这篇文章(https://writequit.org/articles/getting-started-with-git-annex.html)对于理解Karl Forner的回答非常有用,因为它清晰地区分了两种使用git-annex的工作流程:1)跟踪文件元数据而不移动大文件,2)移动和复制大文件。 - John

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