git 如何处理压缩文件?

How does git perform on compressed files?

我有一些 svg 文件希望 git 跟踪。 但是,大多数软件都可以透明地处理 svgz(基本上是 svg.gz)。 因此,我正在考虑切换到 svgz 以节省磁盘 space。

git 的角度来看,将它们设为 svgz 而不是 svg 的优缺点是什么?

我天真的想法是 git diff 算法针对文本文件进行了优化,但在压缩后的对应文件上效果不佳。 由于差异也被压缩,我假设整体方法对于文本文件非常有效,差异占用很少的磁盘 space。 相反,对于压缩数据,它倾向于在内部保存更大的文件,最终我希望存储库在某个时候最终可能会占用更多 space 用于压缩文件。

Git 使用 Xdelta within pack files. This is separate from textual diffs (for which Git uses a variant of XDiff). All of Git's stored objects are also compressed with Git's zlib deflate, which is fundamentally similar to gzip, so at this particular level, it's pretty much a wash.1

的变体

如果您的图片很大,或者您通过 .gitattributes-delta 将它们标记为 "do not attempt to delta-compress",您可能需要预压缩它们,即将它们存储为 svgz 文件,只是为了速度。2 如果它们更小,并且如果某些 svg 文件可以很好地与其他 svg 文件进行增量压缩,您通常会希望 避免 预压缩它们,因为这将使 Git 无法对它们进行增量压缩。

另见 and Are Git's pack files deltas rather than snapshots? There is a bit more in my answer to 。可以说,底线是您必须进行一些测试,以了解哪种方法最适合您的特定情况。请注意,fetch 和 push 使用 "thin packs"(其中对象根据已知存在于另一个 Git 中的基础对象进行压缩,但不包含在包文件中)来加速网络传输,这可能是 比节省磁盘 space 更 重要,所以也要考虑这一点。


1six of one, half a dozen of the other.

2即使Git和其他工具压缩的时间一样,标记-delta也会保持Git 从考虑将它们打包,这将节省 git repack 时间。