我有一些svg
文件,我想被git
跟踪。但是,大多数软件可以透明地处理svgz
(基本上是svg.gz
)。因此,我正在考虑切换到svgz
以节省磁盘空间。
从svgz
的角度来看,将它们作为svg
而不是git
的利弊是什么?
我天真的想法是,git
diff算法针对文本文件进行了优化,并且在压缩对应物上不能同样有效。由于差异也是压缩的,我认为整体方法对于文本文件非常有效,其中差异占用的磁盘空间非常小。相反,对于压缩数据,它倾向于在内部保存更大的文件,并且最终我希望在某些时候存储库可能最终占用更多的压缩文件空间。
Git在包文件中使用Xdelta的变体。这与文本差异(Git使用XDiff的变体)分开。 Git的所有存储对象也使用Git的zlib deflate压缩,这是fundamentally similar to gzip,所以在这个特定的级别,它几乎是a wash.1。
如果您的图像很大,或者您使用.gitattributes
通过-delta
将它们标记为“不要尝试delta压缩”,您可能需要预压缩它们,即将它们存储为svgz
文件,仅用于速度.2如果它们是更小,如果某些svg
文件将与其他svg
文件进行delta压缩,你通常会希望避免预压缩它们,因为这将使Git无法对它们进行delta压缩。
另见Is repacking a repository useful for large binaries?和Are Git's pack files deltas rather than snapshots?我对What does git do when we do : git gc - git prune的回答还有一些。实际情况是,您必须进行一些测试,以了解哪种方法最适合您的具体情况。请注意,fetch和push使用“thin pack”(其中对象针对已知存在于另一个Git中的基础对象进行压缩,但不包含在pack文件中)以加速网络传输,这可能比保存磁盘空间更重要,所以也考虑一下。
1或six of one, half a dozen of the other。
2即使Git和其他工具压缩它们所花费的时间是相同的,标记它们-delta
将使Git不考虑它们的包装,这将节省git repack
时间。