Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Version control 版本控制压缩文件(docx、odt)_Version Control_Mercurial_Zip_Openoffice.org_Docx - Fatal编程技术网

Version control 版本控制压缩文件(docx、odt)

Version control 版本控制压缩文件(docx、odt),version-control,mercurial,zip,openoffice.org,docx,Version Control,Mercurial,Zip,Openoffice.org,Docx,有些格式实际上是伪装的zip文件,例如docx或odt。如果我将它们直接存储在版本控制中,它们将作为二进制文件处理。我的理想解决方案是 有一个钩子,在提交之前为每个foo.docx文件创建一个foo.docx/目录,将所有文件解压缩到其中 (可选)使用一个钩子重新嵌入xml文件 有一个钩子,可以在更新后从存储的文件中重新创建foo.docx 我不希望docx文件本身受到版本控制。(我知道有人建议使用自定义差异的不同方法。) 这可行吗?这对mercurial可行吗 更新: 我知道胡克。我对细节

有些格式实际上是伪装的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>
>hg add foo.docx
>汞状态
foo.docx
>hg提交
>#使用外部编辑器更改foo.docx
>汞状态
M foo.docx
>汞差
+++foo.docx/word/document.xml
-主意
+好得多的主意

您可以使用预提交挂钩来解压,使用更新挂钩来解压。有关如何使用挂钩的详细信息,请参见

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


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

如果您想将解包docx用于核心hg操作,如
diff
status
可以处理打包文件),则必须使用扩展名。我认为您可以采用与as类似的方法,用自己的方法包装回购对象

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


若你们想发疯,你们甚至可以和解包文件合并。但是,将其视为二进制文件并进行区分和合并可能更安全。

如果您能够克服成功解压缩Openoffice文档的障碍,那么您应该能够使用我们在Mercurial中提供的功能。它允许您在每次从存储库读/写时转换文件

不幸的是,您需要做的不仅仅是解压缩foo.docx文件。问题是您需要生成一个文件作为输出,因此您可以
解压缩foo.docx
,然后
tar
向上生成文件。然后,您将对tarball进行版本控制,这应该是可行的,因为tarball只是包含一些元信息的所有单个文件的未压缩连接。仔细想想,一个更简单的解决方案是再次压缩未打包的foo.docx文件,但不指定压缩。这将产生与使用焦油类似的结果


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

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


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

在过去几天里,我一直在努力解决这个问题,并编写了一个小型.NET实用程序,以提取Excel文件并使其正常化,从而使它们更容易存储在源代码管理中。我已在此处发布了可执行文件:

…来源如下:

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

  • 扫描文件夹及其子文件夹以查找任何.xlsx和.xlsm文件
  • 以*.orig格式复制文件
  • 解压每个文件并重新压缩,无需压缩
  • 漂亮地打印存档中任何有效的XML文件
  • 从存档中删除calcchain.xml文件(因为它变化很大,不会影响文件的内容)
  • 内联任何未格式化的文本值(否则,这些值会保存在查找表中,即使修改单个单元格,也会导致内部XML发生重大变化)
  • 删除包含公式的任何单元格中的值(因为它们只能在下次打开图纸时计算)
  • 创建一个子文件夹*.extracted,其中包含解压缩的zip存档内容
显然,并非所有这些都是必要的,但最终的结果是一个电子表格文件仍将在Excel中打开,但它更适合于扩散和增量压缩。此外,存储提取的文件也会使版本历史记录中的每个版本中应用的更改更加明显

如果大家有兴趣的话,我很乐意让这个工具更具可配置性,因为我想不是每个人都希望提取内容,或者可能从公式单元格中删除值,但目前这两个工具对我都非常有用


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

git
具有允许这种情况的钩子行为,但关于第二点,我不了解HGF:请注意,这些文档格式(特别是.xslx和ODF)并没有按照XML标准的规定处理空格,而是(主要是出于实际目的)保留空格,即使没有指明。因此,重新标识文件可能会更改内容。为什么不将zip格式的文件放入修订控制中呢。你想解决什么问题?@Rudi-我想看到有意义的变化。我不想仅仅因为每天对docx文件做一些小的更改就拥有一个庞大的存储库。我发现至少Openoffice对文件的压缩方式非常挑剔。一个简单的解压->压缩循环就足以损坏一个.od*文件。@Rudi你有更多信息吗:什么压缩-