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


98

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

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

有没有一种方法或良好的做法来进行更好的文档版本控制?

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


5
我可以将这些Excel文件转换为CSV文件,然后使用git跟踪它们,以便可以使用diff查看修改。还有其他好的做法吗?
Marcus Thornton 2013年

查看其他答案,我认为比您接受的答案要好。
nealmcb 2014年

Answers:


45

既然您用标记了您的问题 我假设您正在询问有关Git的用法。

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

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

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


4
是的,我知道git。我认为git在跟踪SQL方案时很好。至于Excel文件(.xlsx和.xls),因为它们是二进制文件,所以使用git跟踪它们无法向我展示在人类视角中所做的修改。这就是我的困惑。
Marcus Thornton

2
@MarcusThornton .xlsx是XML,因此应该可以正常工作。通常,无法轻松比较两个.xls文件。您可能可以添加一个预提交的钩子,该钩子将.csv它放在附近,您将能够比较它们。
kirelagin

86

我在这里写的答案可以在这种情况下应用。名为xls2txt的工具可以提供人类可读的.x​​ls文件输出。简而言之,您应该将其放入.gitattributes文件:

*.xls diff=xls

并在.git / config中:

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

当然,我敢肯定,您也可以找到适用于其他文件类型的类似工具,这git diff对于Office文档而言是非常有用的工具。这是我目前在全局.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定制Git-Git属性


2
在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
katrin 2014年

是否仍将文档存储为doc文件或文本文件?如果是文本文件,如何恢复文档?
CMCDragonkai 2014年

@CMCDragonkai这对文件的存储方式没有影响,仅影响diff命令的输出。
2014年

1
所以它仍然存储整个文件,而不是差异文件?
CMCDragonkai

3
回复:xls2txt:极其不愿意从波兰语网站安装封闭源代码工具。这可能是同一回事吗?github.com/hroptatyr/xls2txt没有README,虽然...
jcollum

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来说应该可以正常工作。


其实我还没有试过,但我相信它会-如果你给一个尝试这将是伟大知道
乔恩摹

@JonG我无法使其与LibreOffice一起使用,并且在bitbucket存储库中没有“问题”选项卡。如果我们能解决问题,我很乐意贡献力量!
Christian Droulers,2015年

嗨@ christian-droulers,我已经在Repo上启用了问题,请随时在其中添加一些内容!
乔恩·G

@JonG这看起来很棒,在许多与文档相关的情况下,具有可区分的版本历史记录可能非常有用!但是,为什么在Excel中打开文件很重要?您不能只使用.orig文件吗?您认为规范化可以是可配置的/动态的,以便代码也可以用于docx / pptx吗?
约尔根·特维特(JørgenTvedt),


4

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


2

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

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

现在还处于初期,但可能会有所帮助。


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

1

如另一个答案的注释中所述,.xlsx文件只是XML。

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


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

1

这个Excel实用程序对我来说很好用:

Excel的版本控制

它是用于工作簿和VBA宏的非常简单的版本控制工具。提交版本后,该版本将保存到PC上的Git存储库中。我从来没有尝试过。SQL模式文件,但是我敢肯定有办法解决。


这是我发现的唯一可与.xlsm文件中嵌入的模块一起使用的工具。我所知道的唯一替代方法是运行一个宏,将每个模块导出到其自己的文件中,提交它们,然后运行一个宏,以在合并和合并后再次将它们全部导入。xltrail比这容易得多。
Michael Hoffmann

0

我使用Excel文件的方法与Jon相似,但是我没有处理原始的Excel文本数据,而是将其导出为更友好的格式。

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.