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

Posted

技术标签:

【中文标题】如何对 Excel 文件和 SQL 模式文件执行更好的文档版本控制【英文标题】:How to perform better document version control on Excel files and SQL schema files 【发布时间】:2013-06-09 15:04:28 【问题描述】:

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

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

是否有更好的文档版本控制方法或良好做法?

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

【问题讨论】:

我可能会将这些 Excel 文件转换为 CSV 文件,然后使用 git 跟踪它们,以便我可以使用 diff 来查看修改。还有其他好的做法吗? 查看其他答案,我认为这些答案比您接受的要好。 【参考方案1】:

我写的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

【讨论】:

它在 windows7 上对我不起作用。我已经从这里下载了适用于 Windows 的 catdoc 版本:blog.brush.co.nz/2009/09/catdoc-windows,而不是如上所述编辑 gitconfig 和属性。但我仍然得到: diff --git a/src/Reports/src/main/etc/templates/nbcu.xls b/src/Reports/src/main/etc/templates/nbcu.xls index 2476319..1daec86 100644 Binary文件 a/src/.../test.xls 和 b/src/.../test.xls 不同 GIT 版本:1.7.6.msysgit.1 它仍然将文档存储为文档文件还是文本文件?如果是文本文件,如何恢复文档? @CMCDragonkai 这对文件的存储方式没有影响,只影响diff命令的输出。 所以它仍然存储整个文件,而不是差异? Re: xls2txt: 非常不愿意安装来自波兰网站的闭源工具。这可能是同一件事? github.com/hroptatyr/xls2txt 虽然没有自述文件...【参考方案2】:

既然你已经用git 标记了你的问题,我假设你问的是 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 格式是二进制的,因此您无法从中获得有意义的差异。但您仍然可以查看修改历史记录并签出特定版本。

【讨论】:

是的,我知道 git。我认为 git 在跟踪 SQL 方案时很好。至于 Excel 文件(.xlsx 和 .xls),因为它们是二进制文件,所以使用 git 跟踪它们无法从人类的角度告诉我修改了什么。这就是我的困惑。 @MarcusThornton .xlsx 是 XML,所以应该可以正常工作。一般来说,没有办法轻松比较两个.xls 文件。您可能可以添加一个 pre-commit 钩子,在它附近放置一个 .csv,您将能够区分它们。【参考方案3】:

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

【讨论】:

我实际上没有尝试过,但我认为它会 - 如果你真的尝试一下,很高兴知道 @JonG 我无法让它与 LibreOffice 一起使用,并且 bitbucket 存储库中没有问题选项卡。如果我们能解决问题,我很乐意做出贡献! 嗨 @christian-droulers,我已经在 Repo 上启用了 issue,请随意添加一些内容! @JonG 这看起来很棒,拥有可区分的版本历史记录在许多与文档相关的场景中可能非常有用!但为什么在 Excel 中打开文件很重要?你不能只使用 .orig 文件吗?您是否认为规范化可以配置/动态,以便代码也可以用于 docx/pptx?【参考方案4】:

Tante 在Managing ZIP-based file formats in Git中推荐了一个非常简单的方法:

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

[diff "zip"]
textconv = unzip -c -a

【讨论】:

然后,徐鹏扩展了解决方案,允许使用过滤器对基于 zip 的文件进行版本控制,除了只查看 diff 更改:tante.cc/2010/06/23/managing-zip-based-file-formats-in-git/…【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

两年后它仍然只处理 VBA,而许多其他解决方案处理整个电子表格。十多年来,我实际上并不关心电子表格的 VBA 内容(或者更准确地说,我一直在积极尝试避免有任何内容......)。【参考方案7】:

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

Version Control for Excel

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

【讨论】:

这是我发现的唯一适用于嵌入在 .xlsm 文件中的模块的工具。我知道的唯一替代方法是运行一个宏将每个模块导出到它自己的文件中,提交它们,然后运行一个宏在拉取和合并后再次导入它们。 xltrail 比这容易得多。【参考方案8】:

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

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

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

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

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

至少我使用的 zip 工具 (7-zip) 允许打开/提取所有文件 - 您不必重命名它们。

以上是关于如何对 Excel 文件和 SQL 模式文件执行更好的文档版本控制的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql里把数据导出成excel文件

将 SQLite 数据库模式更改为读写

怎样将SQL数据导出到EXCEL中

怎样将SQL数据导出到EXCEL中

如何将SQL server 2008 里的查询结果导出到 Excel 表内?

如何将Excel数据转换为SQL脚本