Git能够差异化存储GZip文件吗?

6
Git可以将使用Gzip压缩的文本存储为二进制文件,也可以识别它们是文本,并存储更新之间的更改。
1个回答

9

Git 不会尝试查看任何二进制文件。实际上,它甚至也不会尝试查看文本文件。它根本就不存储更新。它所做的是存储每个文件的完整内容,但是它会在整个对象存储中进行 delta-compression。因此,存储在磁盘上的数据实际上只是更新(因此称为“delta-compression”),但 Git 本身却能看到完整的文件。

话虽如此,Git 并不会尝试解压缩 gzip 压缩的文件以便重新压缩自身。这意味着使用gzip压缩的文本将具有与任何其他压缩格式(例如图像)几乎相同的性能,也就是说,没有太多节省空间。


2
那么,如果我解压缩文本文件,从长远来看它可以为我节省空间吗? - James McMahon
1
@JamesMcMahon:我想是这样,不过我得想一想你的文本文件有多大,以及它们有多频繁地更改(以及为什么你一开始就将它们存储为gzipped)。 - Lily Ballard
8
@JamesMcMahon: 可能是这样。我刚做了一个实验:对于一个约1500行、44KB的文本文件,我进行了10000次微小修改,分别将其未压缩和压缩后存储在两个不同的git仓库中(gzip可以将其大小压缩至16KB)。两个仓库的.git目录最终占用了241MB。经过“git gc”处理,未压缩文件版本的大小为6.2MB,压缩文件版本的大小为19MB。显然,git能够利用未压缩文件中的共同内容,但无法利用压缩文件中的共同内容。 - Keith Thompson
@KeithThompson 我想知道它的可扩展性如何。如果文件大小为80MB或800MB,我想知道会发生什么。你有你的测试脚本的要点或其他东西吗? - James McMahon
@JamesMcMahon:最大级别的gzip压缩输出应该是无法被gzip再次压缩的(至少是gzip)。通常,压缩算法的输出在被反馈到同一压缩算法时与随机数据无法区分。如果不行,那么这是一个糟糕的算法。Git可能能够通过一次性跨整个对象存储进行增量压缩而挤出更多的压缩空间,但通常情况下,当您将压缩文件放入Git中时,您应该假设它们不会被进一步压缩。请注意,Keith有19MB的压缩数据,而Git只将其减少到了16MB。 - Lily Ballard

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