版本控制压缩文件(docx,odt)

时间:2010-09-21 22:41:49

标签: version-control mercurial zip openoffice.org docx

有些格式实际上是伪装的zip文件,例如: docx或odt。如果我将它们直接存储在版本控制中,它们将作为二进制文件处理。我理想的解决方案是

  • 有一个钩子,在提交之前为每个foo.docx/文件创建一个foo.docx目录,将所有文件解压缩到其中
  • 可选地,有一个钩子来重新连接xml文件
  • 有一个钩子,可以在更新后从存储的文件中重新创建foo.docx

我不希望docx文件本身受版本控制。 (我知道related question建议使用自定义差异的不同方法。)

这可行吗?这可以用mercurial吗?

更新:

我知道钩子。我对细节很感兴趣。这是一个演示预期行为的会话。

> hg add foo.docx
> hg status
A foo.docx
> hg commit
> # Change foo.docx with external editor
> hg status
M foo.docx
> hg diff
+++ foo.docx/word/document.xml
- <w:t>An idea</w:t>
+ <w:t>A much better idea</w:t>

4 个答案:

答案 0 :(得分:13)

我想知道同样的事情,只是遇到了Mercurial的ZipDoc扩展/过滤器,它似乎就是这样做的!

尚未尝试过,但看起来很有希望!

答案 1 :(得分:5)

如果您能够超越成功解压缩和破解Openoffice文档的障碍,那么您应该能够使用我们在Mercurial中的filter system。这使您可以在每次读/写库中转换文件。

遗憾的是,您必须做的不仅仅是解压缩foo.docx文件。问题是你需要生成一个文件作为输出 - 所以也许你可以unzip foo.docx然后tar生成生成的文件。然后你将对tarball进行版本控制,这应该可以工作,因为tarball只是所有单个文件与一些元信息的未压缩连接。想想看,一个更简单的解决方案是再次压缩解压缩的foo.docx文件,但不指定压缩。这应该给出与使用tar类似的结果。

解决这个问题是我自己想做的事情,所以请发送邮件给Mercurial mailing list报告。

答案 2 :(得分:3)

你可以使用precommit钩子解压缩,并使用zip钩子的更新钩子。有关如何使用挂钩,请参阅the definite guide

小心重命名。如果您将foo.docx重命名为bar.docx,则您的预先提交挂钩将需要删除foo.docx/并添加bar.docx/


更新(抱歉为1k-rep用户提供入门级答案)

如果要将解压缩的docx用于核心hg操作,例如diffstatus可以使用打包文件),则必须使用扩展名。我认为你可以采用与keyword extension类似的方法来将repo对象包装起来。

我已经写了一些扩展但不是在那个硬核级别,所以我无法提供更多细节。

如果你想变得疯狂,你甚至可以与解压缩文件合并。但将它视为二进制文件并将use external tool视为差异和合并可能更安全。

答案 3 :(得分:0)

过去几天我一直在努力解决这个问题,并编写了一个小的.NET实用程序来提取和规范化Excel文件,使它们更容易存储在源代码控制中。我在这里发布了可执行文件:

https://bitbucket.org/htilabs/ooxmlunpack/downloads/OoXmlUnpack.exe

..和来源:

https://bitbucket.org/htilabs/ooxmlunpack

如果有任何兴趣我很乐意让它更易于配置,但是目前,您应该将可执行文件放在一个文件夹中(例如源库的根目录),当您运行它时,它将:

  • 扫描文件夹及其子文件夹以查找任何.xlsx和.xlsm文件
  • 将文件副本作为* .orig
  • 解压缩每个文件并重新压缩而不压缩
  • 打印存档中任何有效XML
  • 的文件
  • 从存档中删除calcchain.xml文件(因为它会发生很大变化而不会影响文件的内容)
  • 内联任何未格式化的文本值(否则这些值保存在查找表中,即使单个单元格被修改,也会导致内部XML发生重大变化)
  • 从包含公式的任何单元格中删除值(因为它们可以在下次打开工作表时计算)
  • 创建一个子文件夹* .extracted,其中包含解压缩的zip存档内容

显然并非所有这些都是必要的,但最终结果是一个电子表格文件仍将在Excel中打开,但更适合于差异和增量压缩。此外,存储提取的文件也会使版本历史记录中的每个版本都应用了哪些更改。

如果有任何胃口,我很高兴能让这个工具更具配置性,因为我猜不是每个人都想要提取的内容,或者可能是从公式细胞中删除的值,但这些对我来说都非常有用。时刻。

在测试中,一个2MB的电子表格'解包'到21MB但是我能够在1.9MB的mercurial数据文件中存储它们的五个版本,每个版本之间有很小的变化,并使用Beyond Compare有效地可视化版本之间的差异文字模式。