提交到代码库前解压缩压缩的数据文件

7
在代码库中以某种方式存储通常压缩的文件的“未压缩”版本是否有意义?如果是这样,是否有一种标准的实现方法?(也许是一个标准的预提交钩子,将每个这样的文件解压缩到一个特殊命名的文件夹中;以及一个后检出钩子,将这些特殊命名的文件夹压缩成LibreOffice知道如何读写的压缩文件?类似于"我应该在归档之前解压缩zip文件吗?"所描述的过程吗?)(也许是通过修改版本控制软件的代码来自动解压缩旧版本和新版本,并存储解压缩文件之间的差异,如果失败或没有提供显着的改进,则回退到原始系统,存储原始文件之间的直接差异,或者简单地直接存储文件?)
我有一些OpenOffice/LibreOffice文件,需要经常编辑。我将它们存储在版本控制库中,正如"Should images be stored in a git repository?"所推荐的那样。虽然我使用的是TortoiseHg或SourceTree来访问我的存储库,而不是git。
我知道Open Office文件实际上是一个压缩了的容器,里面有几个XML文件。(我听说许多其他流行的应用程序“二进制文件格式”也是某种形式的压缩文件)。
我的理解是,即使对这些“二进制”文件进行最小的更改,也会导致整个新文件存储在仓库中。相反,“文本”文件的小改动只会导致更改被存储和传输。
理论上,这将具有以下优点:
  • 当只有几个单词发生变化时,在更改日志的“diff”视图中,我可以看到确切的变化字词。(而不是无信息量的“二进制文件已更改”消息)。
  • 当几个不同的人独立编辑文件的第14版时,更容易将他们所有的改进合并到文件的第16版中,而不会出现回归。
  • 更快的与远程仓库同步--只需要传输短的“更改”,而不是整个(压缩的)文件。
  • 可能更小的仓库,以磁盘空间为衡量--经过几百次更改后,我预计只包含几百个小更改的相对较小的仓库,而不是包含这些文件的几百个完整副本的相对较大的仓库。(我将这个优点列在最后,因为在如今廉价的磁盘空间时代,它几乎是无关紧要的)。
1个回答

2
在存储库中以某种方式存储通常压缩的文件的“未压缩”版本是否有意义?这是有意义的,特别是如果您需要分支和差异。这个旧线程(失效链接)(存档在此处)总结了情况:
对于 Openoffice 文档,如果文件大小由嵌入的图片和其他大型对象所占主导地位,则 git delta 机制可以表现得相当好,因为 OO 文件是 Zip 归档文件,其中每个文件都被单独压缩。如果您不更改图片,则该图片保持原样存储,可以进行 delta。

对于由纯文本内容主导的 OO 文档,git delta 机制无法工作,因为 zip 压缩引入了“混合”,并且文档中的小变化转换为 zip 文件中的非常大的变化。

可以编写一个“clean”过滤器在提交之前进行解压缩。但是,在检出时使用互补的“smudge”过滤器时有一个诀窍。如果您没有正确使用 smudging,则 git 始终显示文件与索引有所更改。正确使用 smudging 意味着使用 OO 使用的完全相同的压缩比率和压缩方法,这可能有点棘手。我尝试在“clean”和“smudge”阶段都使用 zip 二进制文件,但效果不佳。 Smudged 文件始终与原始文件不同。应该在较低的级别上工作以对正在发生的事情进行更精细的控制(libzip),并将压缩参数预置到未压缩的文件中以便在揉合时还原。

更大的问题是,当处理大型 OO 文件时,clean/smudge 可能非常缓慢。


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