114

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

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

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

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

4

9 回答 9

95

我在这里写的答案可以应用于这种情况。一个名为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

于 2013-06-14T10:06:33.943 回答
51

既然你已经用标记了你的问题,我假设你是在询问 Git 的使用情况。

好吧,SQL 转储是普通的文本文件,因此使用 Git 跟踪它们非常有意义。只需创建一个存储库并将它们存储在其中。当您获得文件的新版本时,只需覆盖并提交,Git 就会为您计算出所有内容,您将能够查看修改日期、签出该文件的特定版本并比较不同版本。

.xlsx如果你解压缩它们也是如此。.xlsx文件是 XML 文件的压缩目录(请参阅如何从其内部子组件正确组装有效的 xlsx 文件?)。除非解压缩,否则 Git 会将它们视为二进制文件。可以解压缩.xlsx并跟踪存档内单个 XML 文件的更改。

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

于 2013-06-13T09:51:59.480 回答
23

在过去的几天里,我一直在努力解决这个确切的问题,并编写了一个小的 .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。

于 2014-06-10T16:12:19.667 回答
12

Tante在 Git 中管理基于 ZIP 的文件格式中推荐了一种非常简单的方法:

打开您的 ~/.gitconfig 文件(如果不存在则创建)并添加以下节:

[diff "zip"]
textconv = unzip -c -a
于 2017-02-06T21:32:49.803 回答
5

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

于 2018-06-24T03:06:48.893 回答
2

这个 Excel 实用程序非常适合我:

Excel 的版本控制

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

于 2016-04-12T17:24:15.640 回答
2

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

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

现在还为时尚早,但它可能会有所帮助。

于 2018-02-19T08:41:29.470 回答
1

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

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

于 2013-06-13T11:29:41.203 回答
1

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

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

您只需下载 .xlsm 文件(单击此页面上的查看原始链接。)不要忘记检查自述文件中所述的 Excel 设置。您还可以添加代码以将 SQL 数据导出到文本文件。

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

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

于 2015-10-10T23:27:13.103 回答