【问题标题】:Version-controlling zipped files (docx, odt)版本控制压缩文件(docx、odt)
【发布时间】:2011-04-15 11:14:36
【问题描述】:

有些格式实际上是伪装的 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>

【问题讨论】:

  • git 具有允许这样做的钩子行为,但我不知道 hg
  • 关于您的第二点:请注意,这些文档格式(尤其是 .xslx 和 ODF)不会按照 XML 标准的规定处理空格,但 - 主要是出于实际目的 - 保留空格,即使这是未注明。因此重新缩进文件可能会改变内容。
  • 您为什么不希望将 zip 格式的文件放入修订控制中。你想解决什么问题?
  • @Rudi - 我想看到有意义的变化。我不想要一个庞大的存储库,因为我每天都对一个 docx 文件进行小的更改。

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


【解决方案1】:

我也在想同样的事情,刚刚遇到了 Mercurial 的 ZipDoc 扩展/过滤器,它似乎正是这样做的!

还没有尝试过,但看起来很有希望!

【讨论】:

  • 安装扩展后是否需要hg rm然后重新添加文件?谢谢!
  • @NHDaly 不确定;我实际上并没有去尝试它!应该很容易在测试仓库中进行测试:-)
  • git 有类似的东西吗?
【解决方案2】:

如果您能够克服成功解压和压缩 Openoffice 文档的障碍,那么您应该能够使用 Mercurial 中的filter system。这使您可以在每次从/向存储库读取/写入时转换文件。

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

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

【讨论】:

  • 无压缩压缩似乎对 odt 和 docx 文件都有效,感谢您的提示。
  • zipdoc 扩展解压缩然后压缩不压缩,反之亦然。不过,我来这里是为了了解如何区分它们。我将它们报告为不可区分的二进制文件。
【解决方案3】:

您可以使用预提交挂钩来解压缩,并使用更新挂钩来压缩。请参阅the definite guide 了解如何使用钩子。

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


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

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

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

如果你想发疯,你甚至可以合并解压文件。但将其视为二进制和use external tool 进行差异和合并可能更安全。

【讨论】:

  • 我发现至少 Openoffice 对文件的压缩方式非常挑剔。一个简单的 unzip->zip 循环就足以破坏 .od* 文件。
  • @Rudi 你有更多信息吗:使用了什么压缩工具?发生了什么?等等
【解决方案4】:

在过去的几天里,我一直在努力解决这个确切的问题,并编写了一个小的 .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 有效地可视化版本之间的差异文本模式。

【讨论】:

  • 该工具运行良好。不幸的是,不会提取 VBA 项目(将生成一个文件:vbaProject.bin)。你知道怎么做吗?
猜你喜欢
  • 2012-01-03
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2011-03-18
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多