git LFS 如何比 git 更高效地跟踪和存储二进制数据?

Gab*_*les 4 git git-lfs

我知道 git LFS 导致 git 在文本文件中存储字符串“指针”,然后 git LFS 下载该目标二进制文件。这样,远程 git 服务器上的 git repos 就会更小。但是,git LFS 仍然必须存储二进制文件,所以在我看来,本地存储(经过一段时间后)git lfs pull)没有什么不同,并且远程 git LFS 服务器数据加上远程 git 数据的总和仍然相似。

我缺少什么?git LFS 如何高效跟踪二进制文件?


更新(自写此问题以来经过额外学习):不要使用git lfs. 我现在建议反对使用git lfs

也可以看看:

  1. 我的评论在我接受的答案下面
  2. 我刚刚在下面添加了我自己的答案

我开始提出这个问题是因为我相信 Git LFS 是令人惊奇和美妙的,并且我想知道如何做到这一点。相反,我最终意识到 Git LFS 是我日常工作流程问题的原因,我不应该再使用它,也不应该再推荐它。

概括:

正如我在这里所说的

对于个人、免费的 GitHub 帐户来说,它的限制太大了,而对于付费的公司帐户,它需要git checkout花费几秒钟到长达 3 个多小时,特别是对于远程工作人员来说,这完全是浪费他们的时间。我处理这个问题三年了,这太可怕了。我编写了一个脚本每晚执行一次来缓解这种情况,但我的雇主拒绝给我购买更大的 SSD 来给我足够的空间每晚git lfs fetch执行一次,所以我仍然经常遇到多小时结账的问题。除非您删除整个 GitHub 存储库并从头开始重新创建,否则git lfs fetch --all也不可能撤消与存储库的集成。git lfs

细节:

我刚刚发现免费版本git lfs如此严格的限制,以至于它毫无用处,我现在正在将其从我所有的公共免费存储库中删除。请参阅此答案(GitHub.com 的存储库大小限制)并搜索“git lfs”部分。

在我看来,唯一的好处git lfs是,当您克隆存储库时,它可以避免一次下载大量数据。就是这样!对于任何总内容大小(git repo + 可能的 git lfs repo)< 2 TB 左右的存储库来说,这似乎是一个非常小的好处,即使不是无用。所有这些使用git lfs所做的就是

  1. git checkout永远(字面意思是几个小时(坏)
  2. 制作我通常快速且离线的 git 命令,例如git checkout现在变成在线且慢速的 git 命令(不好),并且
  3. 充当另一个需要付费的 GitHub 服务(不好)。

如果您像我一样尝试使用git lfs克服 GitHub 的100 MB 最大文件大小限制,请不要这样做!你几乎会立即耗尽git lfs空间,特别是如果有人克隆或分叉你的存储库,因为这会影响你的限制,而不是他们的限制!相反,“可以使用诸如tarplussplit之类的工具,或者split单独使用工具,将一个大文件分割成更小的部分,例如每个 90 MB”(源代码),这样您就可以将这些二进制文件块提交到您的常规文件中。git存储库。

最后,GitHub 上停止使用git lfs并完全释放该空间的“解决方案”绝对是疯狂的疯子!您必须删除整个存储库!请参阅此处的问答:如何删除 git-lfs 跟踪的文件并释放存储配额?

GitHub 的官方文档证实了这一点(强调是添加的):

从 Git LFS 中删除文件后, Git LFS 对象仍然存在于远程存储上,并将继续计入您的 Git LFS 存储配额。

要从存储库中删除 Git LFS 对象,请删除并重新创建存储库。当您删除存储库时,任何关联的问题、星号和分支也会被删除。

我不敢相信这甚至被认为是一个“解决方案”。我真的希望他们正在努力解决这个问题。

对考虑使用的雇主和公司的建议git lfs

快速总结:不要使用git lfs. 相反,请为您的员工购买更大的 SSD。如果您最终使用了,请为您的员工购买更大的 SSD,这样他们就可以在每晚睡觉时git lfs运行一个脚本。git lfs fetch --all

细节:

假设您是一家科技公司,拥有 50 GB 大小的大型单一存储库,以及您希望成为存储库一部分的二进制文件和数据,大小为 4 TB。与其给他们提供不足的 500 GB ~ 2 TB SSD,然后再求助于家庭互联网连接git lfs,这会使git checkout工作时间从几秒缩短到几小时,不如为您的员工提供更大的固态硬盘!一名典型的技术员工每天的成本 > 1000 美元(每周 5 个工作日 x 48 个工作周/年 x 1000 美元/天 = 24 万美元,低于他们的工资 + 福利 + 管理费用)。因此,如果能节省他们的时间,价值 1000 美元的 8 TB SSD 是完全值得的!购买示例:

  1. 8TB Sabrent Rocket M.2 SSD,1100 美元
  2. 8TB Inland M.2 SSD,900 美元

现在,他们希望有足够的空间git lfs fetch --all在自动夜间脚本中运行,以获取所有远程分支的 LFS 内容,以帮助缓解(但不是解决)这个问题,或者至少git lfs fetch origin branch1 branch2 branch3获取最常用分支的哈希内容。

也可以看看

  1. 真正富有洞察力的问答也倾向于使用git lfs[即使对于远程存储库]:本地存储库是否需要 Git LFS?
  2. git lfs 的优点是什么?
  3. 我的问答:挂接失败后如何恢复git lfs post-checkoutgit checkout
  4. 我的答案:如何缩小 git 存储库中的 .git 文件夹
  5. 我的问答:之间有什么区别?git lfs fetchgit lfs fetch --allgit lfs pull

Joh*_*nck 11

当您克隆 Git 存储库时,您必须下载其整个历史记录的压缩副本。您可以访问每个文件的每个版本。

使用 Git LFS,文件数据不会存储在存储库中,因此当您克隆存储库时,不必下载 LFS 中存储的文件的完整历史记录。仅从 LFS 服务器下载每个 LFS 文件的“当前”版本。从技术上讲,LFS 文件是在“签出”而不是“克隆”期间下载的。

因此,Git LFS 并不是为了有效地存储大文件,而是为了避免下载所选文件的不需要的版本。无论如何,这段历史通常不是很有趣,如果您需要旧版本,Git 可以连接到 LFS 服务器并获取它。这与常规 Git 形成鲜明对比,常规 Git 允许您离线签出任何提交。

  • 请注意,对于现代 git(服务器和客户端都必须支持它),第一句话不再正确。通过使用[无斑点克隆](https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone)可以获得与使用LFS类似的效果/):您将获得一个功能齐全的存储库,该存储库比完整的存储库要小,并且可以按需下载缺少的内容。 (6认同)
  • 我很高兴您在这里记录了这些限制,但我认为我们应该清楚它们是 Git LFS *on GitHub* 的限制,而不一定是一般的 Git LFS。我从未真正见过有人在 GitHub 上的免费帐户上使用 Git LFS,也许这就是原因。 (5认同)

归档时间:

查看次数:

2852 次

最近记录:

1 年,7 月 前