20

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

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

我不希望 docx 文件本身受版本控制。(我知道一个相关的问题,其中建议使用自定义差异的不同方法。)

这是可行的吗?这对 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

4 回答 4

13

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

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

于 2011-06-17T12:08:53.250 回答
5

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

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

解决这个问题是我自己想做的事情,所以请通过向Mercurial 邮件列表发送邮件来报告。

于 2010-09-24T11:23:58.803 回答
3

您可以使用 precommit hook 来解​​压缩,使用 update hook 来压缩。请参阅有关如何使用钩子的明确指南。

重命名时要小心。如果您重命名foo.docxbar.docx,您的 precommit 挂钩将需要删除foo.docx/和添加bar.docx/.


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

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

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

如果你想发疯,你甚至可以与解压文件合并。但将其视为二进制并使用外部工具进行差异和合并可能更安全。

于 2010-09-22T01:24:46.383 回答
1

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

于 2014-06-10T15:33:43.533 回答