所以我已经开始使用git了一段时间,并逐渐理解它是如何工作的.我理解的一个要点是 - 每次进行新提交时都会创建一个快照.当然,快照只包含已更改的文件和指向未更改文件的指针.
每次你在Git中提交或保存项目的状态时,它基本上都会记录当时所有文件的外观,并存储对该快照的引用.为了提高效率,如果文件没有改变,Git不会再次存储文件 - 只是指向它已存储的先前相同文件的链接.
但是,假设我有一个很大的文件,例如2GB的文本文件.我将该文件更改10次,因此每天进行10次提交,这是否意味着 - 我现在在我的计算机上有10个2GB文件?这似乎对我来说效率很低所以我相信情况可能并非如此.
有人可以澄清这种情况会发生什么吗?
简短的回答是"是的,你现在有10个2GB文件".然而:
提交下的"文件"存储为"blob"对象,所有 git对象(blob,树,提交和注释标记)都以zlib放气格式保存在内部.因此,2 GB的文本文件实际上是一个相当小的对象.
"松散的"物体(所有这些物品,最后再次)最终被"包装".您可以手动执行此操作git pack-objects和git repack,但一般只是让混帐做它自己的标准"垃圾回收"的一部分(git gc).在一个包中,对象是针对类似对象的三角形压缩.大多数文件的最终结果令人印象深刻.
所有这一切,git最终会失败,如果你喂它很多大型不可压缩的二进制文件(我不得不在以前的工作场所处理这个问题,我们将2GB的.tgz文件填充到repos中).它们不会放气,它们通常不会进行三角形压缩,最终甚至包装格式都会消失.相对广泛使用至少有两种解决方案:git-annex和git-bup.请参阅使用git管理大型二进制文件.