我有一些svg
要跟踪的文件git
。
但是,大多数软件可以透明地处理svgz
(基本上是svg.gz
)。
因此,我正在考虑切换到svgz
以节省磁盘空间。
从svgz
的角度来看,将它们设为svg
而不是git
有何利弊?
我天真的想法是git
diff 算法针对文本文件进行了优化,在压缩后的同类文件上效果不佳。
由于差异文件也被压缩,因此我认为总体方法对于文本文件非常有效,其中差异仅占用很少的磁盘空间。
相反,对于压缩数据,它将倾向于在内部保存较大的文件,并且最终,我希望存储库最终可能会占用更多的压缩文件空间。
答案 0 :(得分:4)
Git在打包文件中使用Xdelta的变体。这与文本差异(Git使用XDiff的变体)不同。 Git的所有存储对象也都用Git的zlib deflate(fundamentally similar to gzip)压缩,因此在此特定级别上,它几乎是a wash。 1
如果您的图片很大,或者您将它们标记为“不要尝试通过.gitattributes
通过-delta
与svgz
进行增量压缩,则可能需要对其进行预压缩,即将它们存储为svg
个文件,只是为了提高速度。 2 如果它们较小,并且如果某个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的回答还有很多。最重要的是,您将必须进行一些测试试验,以查看哪种方法最适合您的特定情况。请注意,提取和推送使用“瘦包”(将对象压缩到另一个Git中已知的基本对象中,但未包含在包文件中)来加快网络传输,这可能更多比节省磁盘空间重要,因此请同样考虑。
1 或six of one, half a dozen of the other。
2 即使Git和其他工具压缩它们所花费的时间是相同的,标记它们git repack
也会使Git不再考虑将它们打包,这将节省{{ 1}}时间。