为什么Git / Mercurial存储库使用的空间更少?


15

我已经在这里和SO上进行了几次讨论,以至于DVCS存储库所使用的空间与其集中式对应部分的空间相同或更少。我可能已经错过了,但是我找不到很好的解释。有人知道吗



1
我没有,谢谢!因此,我从中了解到有两个答案:使用zlib进行压缩以及在可能的情况下将对象另存为packfiles。Mozilla的例子也很棒!
Alex Florescu 2012年

1
@Alex不,这错过了主要原因。SVN保存完整的快照,Git和Mercurial仅保存HEAD版本和差异。使用常规压缩可以为您提供约60–80%的最佳压缩率。使用差异可以使您获得多达99%的收益。这些数字虽然不算实际-实际数字可能有所不同;该趋势将是相同的,但。
Konrad Rudolph

@KonradRudolph,这不是所有关于packfile的内容吗?
亚历克斯·弗洛雷斯库

@Alex不是。据我所知,packfile会将多个文件打包成一个文件。这不一定相关。
康拉德·鲁道夫

Answers:


18

根据我自己的经验,以下陈述都是正确的:

  • Git在存储文本文件以及仅存储这些已更改的文件方面非常有效。因此,在对SVN和Git进行比较以比较存储库大小时,它们可能是相似的,或者对于Git来说甚至可能有很小的优势。
  • 如果您比较大量文件为Office文件(例如MS Word,Excel,Powerpoint等)的存储库大小,则完全错误。这里的Git也存储完整的副本,这意味着在Powerpoint幻灯片堆栈上进行10次小的更改就可以生成10个完整的副本,其中Subversion仅存储二进制diff,这可能会小100倍。

如果您比较结帐位置(它本身就是Git的存储库),那么情况就完全不同了:

  • Subversion为每个文件存储一个完整的副本,因此,结帐位置的大小通常是文件本身大小的2倍。
  • Git在本地存储存储库的完整历史记录,因此根据历史记录的大小,它可能比Subversion签出副本的历史记录小或大得多。

如果比较必须向下或上载的字节数,则该字节数将再次不同。

  • Subversion通常只发送或接收较少的字节,因为它仅发送差异。它必须在每次提交和更新时执行此操作。
  • Git必须(首先)获取整个存储库,然后发送完整的文件(压缩的?),这对于文本文件而言并没有什么不同,但是对于二进制文件而言可能有所不同。是的,Git仅在您将某些内容推入或拉出到远程存储库时才这样做。

因此,最后,您将苹果与橙子进行了比较,并且根据要使用Subversion或Git进行处理的结果可能有所不同。


@jk询问完整副本或二进制差异,而我无法回答该问题。我问了马修·麦卡洛(Matthew McCullough),后者最近在Jax 2012上(我访问过)举办了Git研讨会。他花了很多时间(非常感谢他)详细解释了Git的内部工作。因此,是的,那里有一个压缩程序(我还将对一个Microsoft Office文件进行实验,并将其与他的要旨进行比较),但是没有,压缩是在整个文件上完成的。引用他的要点:

每次提交时,松散的对象都以压缩但非增量格式写入。


1
您确定git可以存储Office文件的完整副本吗?我认为它也存储二进制差异。当然,这类文件的真正问题在于它们通常已经被压缩,因此,小的更改可能会导致整个文件更改
jk。

2
(通过电子邮件)问一个比我了解得多的人,然后将他的答案包括在我的答案中。
mliebelt

6
在存储方面,Git在所有方面都完全相同地对待文本和二进制文件。松散对象与打包对象与文本与二进制无关。二进制文件通常导致差异比文本文件大得多的原因是,许多二进制格式(包括所有新的Office格式)已被压缩,因此即使内容的很小变化也常常导致生成的二进制blob发生较大变化。这同样是git和subversion所关心的问题,但是subversion只在服务器上带来损失,而git到处都是。
Jan Hudec 2012年

4
松散对象还是打包对象与文本还是二进制无关。这是查找二进制差异的艰巨工作的分期付款。速度是git的重要功能,因此在常规操作中,git仅压缩新数据并将其拍打到存储库中。这是松散的物体。比起您通过调用请求git gc或堆积过多的松散对象的要求,它会找到合适的候选对象以对其进行delta压缩(git可以与以前的版本进行差异比较),将这些delta存储在“ pack”中并删除这些松散的对象。
Jan Hudec

3
对于那些对真实数字感兴趣的人:我只是比较了来自完全相同的仓库的两个工作副本。SVN工作副本约为2.9 GB,GIT工作副本约为0.8 GB。
JensG 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.