SO和其他地方的数十个问题和答案都强调Git无法处理大型文件或大型回购.建议使用一些变通方法,例如git-fat和git-annex,但理想情况下Git会本地处理大型文件/ repos.
如果这种限制已存在多年,是否有理由限制尚未消除?我认为Git中存在一些技术或设计挑战,这使得大文件和大型repo支持非常困难.
很多相关的问题,但似乎都没有解释为什么这是一个很大的障碍:
Pau*_*per 16
基本上,它取决于权衡.
你的一个问题有一个来自Linus自己的例子:
[...] CVS,即它真的最终面向"一次一个文件"模型.
这很好,因为你可以有一百万个文件,然后只查看其中一些文件 - 你甚至都看不到其他999,995文件的影响.
从根本上说,Git从来没有真正看过不到整个回购.即使你稍微限制一些事情(即只检查一部分,或者让历史记录稍微回顾一下),git最终仍然关心整个事情,并传授知识.
因此,如果你强迫它将一切看作一个巨大的存储库,那么git会非常糟糕.虽然我们可以改进它,但我不认为这部分是可以修复的.
是的,然后是"大文件"问题.我真的不知道如何处理大文件.我知道,我们很害羞.
正如您将找不到具有O(1)索引访问和插入的数据结构一样,您将找不到能够完美地执行所有操作的内容跟踪器.
Git故意选择在某些方面做得更好,对别人有害.
磁盘使用情况
由于Git是DVCS(分布式版本控制系统),每个人都有整个仓库的副本(除非你使用相对较新的浅层克隆).
这有一些非常好的优势,这就是为什么像Git这样的DVCS变得非常受欢迎.
但是,具有SVN或CVS的中央服务器上的4 TB存储库是可管理的,而如果您使用Git,则每个人都不会因为携带它而感到激动.
Git有一个很好的机制,通过在文件之间创建delta链("diffs")来最小化repo的大小.Git在创建它们时不受路径或提交命令的限制,它们确实工作得很好....有点像gzipping整个repo.
Git将所有这些小差异放入packfiles中.Delta链和packfiles使得检索对象需要更长的时间,但这对于最小化磁盘使用非常有效.(还有那些权衡.)
这种机制对于二进制文件不起作用,因为它们往往相差很大,即使在"小"变化之后也是如此.
历史
当您签入文件时,您将永远拥有它.你的孙子孙子孙子们每次克隆你的回购时都会下载你的猫咪gif.
这当然不是git独有的,因为DCVS会使后果更加重要.
虽然可以删除文件,但git的基于内容的设计(每个对象id是其内容的SHA)使得删除这些文件变得困难,侵入性和破坏历史记录.相比之下,我可以从工件仓库或S3存储桶中删除crufty二进制文件,而不会影响我的其他内容.
困难
使用非常大的文件需要大量细致的工作,以确保最小化操作,并且永远不会将整个内容加载到内存中.在创建具有与git一样复杂的功能集的程序时,这非常难以可靠地完成.
结论
最终,那些说"不要把大文件放在Git中"的开发人员有点像那些说"不要把大文件放在数据库中"的人.他们不喜欢它,但任何替代方案都有缺点(在一种情况下Git整合,ACID合规和FK与另一种).实际上,它通常可以正常工作,特别是如果你有足够的内存.
它的效果不如它的设计效果好.
git"无法处理"大文件并不是真的.只是你可能不想使用git来管理大型二进制文件的存储库,因为git repo包含每个文件的完整历史记录,并且delta压缩在大多数类型的二进制文件上的效果远远低于它文本文件.结果是一个非常大的repo,需要很长时间才能克隆,使用大量磁盘空间,并且由于其必须通过大量数据,因此对于其他操作可能会慢得令人无法接受.
替代方案和附加组件(如git-annex)分别存储大型二进制文件的修订版,其方式违反了git通常假设的任何时候存储库的每个状态都可脱机,但避免了必须发送大量数据.
| 归档时间: |
|
| 查看次数: |
3363 次 |
| 最近记录: |