![.odt 与 .fodt:哪个对 git 存储库来说最节省空间?](https://linux22.com/image/1425810/.odt%20%E4%B8%8E%20.fodt%EF%BC%9A%E5%93%AA%E4%B8%AA%E5%AF%B9%20git%20%E5%AD%98%E5%82%A8%E5%BA%93%E6%9D%A5%E8%AF%B4%E6%9C%80%E8%8A%82%E7%9C%81%E7%A9%BA%E9%97%B4%EF%BC%9F.png)
对于 git 存储库来说,哪个最节省空间:LibreOffice/OpenOffice.odt
文件还是.fodt
文件?我认为应该是.fodt
,因为使用未压缩的 XML 格式,.fodt
存储库压缩器将能够有效地利用文件之间的冗余,而.odt
文件已经压缩,无法进一步压缩。但这只是猜测。有人有实际经验吗?
答案1
我进行了以下测试:
将 5 个小 .odt 修订版放入存储库。我对每个 odt 文档都做了小改动。
我为 .FODT 提交了类似的数据。它们是通过提取 ODT 的相应修订版并将其保存到 .FODT 获得的。
我的结果如下:
before gc after gc
odt 260k 260k
fodt 118k 38k
注意,我测量了实际保存修订的 .git 目录的大小。
我没有考虑 ODT/FODT 文件本身,因为这不会给出合理的结果。
我只测量了.git 文件夹的大小。
ODT 与压缩的 FODT 非常相似,并且预计 FODT 比 ODT 大得多。
由于估计 Git 历史记录的增长可能有意义,因此在测量 Git 大小时应排除 ODT/FODT,因为它们只直接存储一次,与历史记录长度无关。从长远来看,历史记录占用了大部分空间,因此为了在简单测试中获得更相关的测量结果,在估计存储库大小时不应考虑工作目录中的文档本身。
答案2
进行一些快速而粗略的测试后,我将一个小.odt
文件的十个修订版本放入一个裸 git 存储库,然后将该文档的相同十个修订版本以.fodt
格式放入另一个裸存储库。存储库的大小如下:
before gc after gc
odt 408k 188k
fodt 399k 148k
因此,尽管文件本身比等效文件大 2.7 倍,.fodt
但存储库大小却节省了一点点。.fodt
.odt
答案3
.fodt
.odt
由于它是基于文本的,因此通常应该使用格式。
当文件相似时,Git 会跟踪文件之间的更改,从而允许将提交存储为少量差异数据。当文件发生较大变化时,它将回退到存储整个文件,因为差异最终可能比新文件大。
对于许多二进制文件格式,尤其是压缩文件,一个小小的改变就可能彻底改变文件的内容,因此每次改变都会导致存储一个新文件,而不仅仅是差异部分(Git 不会神奇地理解文件格式[1])。应该优先考虑基于文本的格式对于经常更改的文件当您关心优化存储库时。请注意,如果文件很少更改,则可能会出现这两种情况,因为虽然 Git 会压缩文本文件进行存储,但 .odt 格式的压缩可能优于 Git,因为它对文件的使用有更多的了解(尽管 Git 的压缩算法在某些情况下可能优于其他算法;.odt
不是一种高度特定的格式——它是 XML)。
[1] 请注意,如果你可以编写 Git 脚本来在文件格式之间进行无损转换(.odt
并且.fodt
可能兼容),并且你喜欢这种.odt
格式,那么你可以编写 git 脚本来转换以存储在源代码管理中,然后再转换回来存储在本地存储库中(请参阅此处的答案https://stackoverflow.com/questions/8001663/can-git-treat-zip-files-as-directories-and-files-inside-the-zip-as-blobs举个例子)。