如何在Excel文件和SQL模式文件上执行更好的文档版本控制

问题描述 投票:87回答:9

我负责几个Excel文件和SQL模式文件。我该如何对这些文件执行更好的文档版本控制?

我需要知道这些文件中修改过的部分(不同部分)并保留所有版本以供参考。目前我在文件名上附加时间戳,但我发现它似乎效率低下。

有没有办法或好的做法来做更好的文档版本控制?

顺便说一句,编辑通过电子邮件发送给我文件。

git version-control ms-office versioning
9个回答
37
投票

既然你用标记了你的问题,我假设你在询问Git的用法。

好吧,SQL转储是普通的文本文件,所以用Git跟踪它们是完全合理的。只需创建一个存储库并将其存储在其中。当你获得一个新版本的文件时,只需覆盖它并提交,Git会为你找出一切,你将能够看到修改日期,检查这个文件的特定版本并比较不同的版本。

如果你解压缩它们,.xlsx也是如此。 .xlsx文件是压缩的XML文件目录(参见How to properly assemble a valid xlsx file from its internal sub-components?)。除非解压缩,否则Git会将它们视为二进制。可以解压缩.xlsx并跟踪对存档内各个XML文件的更改。

您也可以使用.xls文件执行此操作,但问题是.xls格式是二进制的,因此您无法从中获得有意义的差异。但您仍然可以看到修改历史记录和结帐特定版本。


82
投票

我写的答案here可以应用于这种情况。名为xls2txt的工具可以提供.xls文件的人类可读输出。简而言之,您应该将它放到.gitattributes文件中:

*.xls diff=xls

在.git / config中:

[diff "xls"]
    binary = true
    textconv = /path/to/xls2txt

当然,我相信你也可以找到其他文件类型的类似工具,使git diff成为办公文档非常有用的工具。这是我目前在我的全局.gitconfig中所拥有的:

[diff "xls"]
    binary = true
    textconv = /usr/bin/py_xls2txt
[diff "pdf"]
    binary = true
    textconv = /usr/bin/pdf2txt
[diff "doc"]
    binary = true
    textconv = /usr/bin/catdoc
[diff "docx"]
    binary = true
    textconv = /usr/bin/docx2txt

Pro Git的书中有一个很好的章节:8.2 Customizing Git - Git Attributes


22
投票

在过去的几天里,我一直在努力解决这个问题,并编写了一个小的.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中打开的电子表格文件,但更适合于差异和增量压缩。此外,存储提取的文件也使得在版本历史中更明显地在每个版本中应用了哪些更改。

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

在测试中,一个2 MB的电子表格'解包'到21 MB,但后来我能够在1.9 MB的Mercurial数据文件中存储五个版本的每个,并且在文本中使用Beyond Compare有效地显示版本之间的差异模式。

注意:虽然我正在使用Mercurial,但我在研究我的解决方案时读到了这个问题,并且没有任何关于该解决方案的Mercurial特定内容,应该适用于Git或任何其他VCS。


7
投票

Tante在Managing ZIP-based file formats in Git中非常简单:

打开〜/ .gitconfig文件(如果已经存在则创建)并添加以下节:

[diff“zip”]

textconv = unzip -c -a

1
投票

我们为Excel工作簿构建了一个开源Git命令行扩展:https://www.xltrail.com/git-xltrail

简而言之,它的主要特点是它使git diff可以处理任何工作簿文件格​​式,以便它显示工作簿的VBA内容上的差异(在某些时候,我们也会为工作表内容工作)。

它还处于早期阶段但可能有所帮助。


1
投票

正如另一个答案的评论中所提到的,.xlsx文件只是XML。

要访问XML目录(可以使用git-able),必须将.xlsx文件“解压缩”到目录中。在Windows上快速查看此方法是重命名该文件 .xlsx到 .zip,你会看到内在的内容。我将它与二进制文件一起存储,以便在结帐时,您无需执行其他步骤即可在Excel中打开文档。


1
投票

这个Excel实用程序对我很有用:

Version Control for Excel

对于工作簿和VBA宏来说,它是一个非常简单的版本控制工具。提交版本后,它将保存到PC上的Git存储库中。我从未尝试过。 SQL模式文件,但我确信有办法解决。


1
投票

使用打开的文档扩展名.fods。它是一种简单的,未压缩的XML标记格式,Excel和LibreOffice都可以打开,并且差异看起来很好。


0
投票

我使用Excel文件的方法类似于Jon的,但我没有使用原始Excel文本数据,而是导出为更友好的格式。

这是我使用的工具:https://github.com/stenci/ExcelToGit/tree/master

您只需下载.xlsm文件(单击this page上的View Raw链接。)不要忘记按照自述文件中的说明检查Excel设置。您还可以添加代码以将SQL数据导出到文本文件。

该工作簿既是从二进制Excel到文本文件的转换器,也是Windows Git工具的启动器,它也可以用于非Excel相关项目。

我的工作版本配置了许多Excel工作簿。我也使用该文件为非Excel项目打开Git-gui,只需手动添加git文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.