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

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

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

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

By the way, editors send me the files via email.

108477 次浏览

既然您已经用 标记了您的问题,那么我假设您正在询问 Git 在这方面的用法。

SQL 转储是普通的文本文件,因此使用 Git 跟踪它们非常有意义。只要创建一个存储库并将它们存储在其中。当你得到一个文件的新版本时,只要覆盖它并提交,Git 就会为你解决所有问题,你就可以看到修改日期,检出这个文件的特定版本,并比较不同的版本。

如果对 .xlsx进行减压,它们也是如此。.xlsx文件是 XML 文件的压缩目录(参见 如何从其内部子组件正确组装一个有效的 xlsx 文件)。Git 将它们视为二进制文件,除非解压缩。可以解压 .xlsx并跟踪对归档文件中的单个 XML 文件的更改。

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

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

要访问 XML 目录(git-able) ,必须“解压缩”。将 xlsx 文件放到一个目录中。在 Windows 上看到这一点的一个快速方法是重命名文件 < filename > 。Xlsx 到 < filename > 。Zip,您将看到内部内容。我将它与二进制文件一起存储,这样当您结帐时,您就不必为了在 Excel 中打开文档而执行其他步骤。

我所写的 给你的答案可以应用于这种情况。一个名为 Xls2txt的工具可以提供人类可读的输出。Xls 文件。所以简而言之,你应该把这个放到你的。Gitproperties 文件:

*.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

在过去的几天里,我一直在与这个问题作斗争,并且写了一个小的。NET 实用程序提取和规范化 Excel 文件,使其更容易存储在源代码管理中。我在这里发布了可执行文件:

Https://bitbucket.org/htilabs/ooxmlunpack/downloads/ooxmlunpack.exe

. . 和这里的来源:

https://bitbucket.org/htilabs/ooxmlunpack

如果有任何兴趣,我很乐意让它更加可配置,但现在,你应该把可执行文件放在一个文件夹(例如,你的源代码库的根) ,当你运行它时,它会:

  • 扫描该文件夹及其子文件夹以查找任何.xlsx 和.xlsm 文件
  • Take a copy of the file as *.orig.
  • Unzip each file and re-zip it with no compression.
  • 漂亮地打印归档文件中的任何有效 XML 文件。
  • Delete the calcchain.xml file from the archive (since it changes a lot and doesn't affect the content of the file).
  • Inline any unformatted text values (otherwise these are kept in a lookup table which causes big changes in the internal XML if even a single cell is modified).
  • 从包含公式的任何单元格中删除值(因为它们只能在下次打开工作表时计算)。
  • 创建一个包含解压缩存档内容的子文件夹 * 。

显然,并非所有这些事情都是必需的,但是最终的结果是仍然会在 Excel 中打开的电子表格文件,但是这个文件更容易受到差异化和增量压缩的影响。另外,存储提取的文件也使得在版本历史记录中更加清楚每个版本中应用了哪些更改。

如果有任何需求,我很乐意让这个工具更加可配置,因为我猜不是每个人都希望提取内容,或者可能从公式单元格中删除值,但这两个对我现在都非常有用。

在测试中,一个2MB 的电子表格“解包”到21MB,然后我能够在一个1.9 MB 的 Mercurial 数据文件中存储5个版本,每个版本之间有很小的变化,并在文本模式下使用 无与伦比有效地可视化版本之间的差异。

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

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

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

您只需下载。Xlsm 文件(单击 这一页上的 ViewRaw 链接)不要忘记检查自述文件中描述的 Excel 设置。还可以添加将 SQL 数据导出到文本文件的代码。

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

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

这个 Excel 工具非常适合我:

Excel 版本控制

它是一个用于工作簿和 VBA 宏的非常简单的版本控制工具。一旦你提交了一个版本,它就会被保存到你电脑上的 Git 存储库中。我从没试过。SQL 模式文件,但我肯定有办法解决这个问题。

Tante 在 Rel = “ nofollow noReferrer”> 在 Git 中管理基于 ZIP 的文件格式中推荐了一个非常简单的方法:

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

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

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

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

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

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

如果您不愿意将第三方转换器下载到您的项目中,另一种选择是编写您自己的脚本来为您转换 Excel 文件。我使用 Python 添加了自己的转换器。巨蟒脚本:

from pandas import DataFrame, read_excel
from argparse import ArgumentParser
from os import remove




def change_file_format_to_csv(filename):
filename = filename.split(".")
filename[-1] = 'csv'




if __name__ == "__main__":
# Parse arguments
parser = ArgumentParser()
parser.add_argument("-i", "--input", default="", required=False,
help="Input file to be converted")
args = parser.parse_args()


# Load input
print(args.input)
content = read_excel(args.input)


# Change filename to csv
filename_output = args.input.split(".")
filename_output[-1] = "csv"
filename_output = '.'.join(filename_output)


# Store input as CSV
content.to_csv(filename_output)


# Cat output to command line
with open(filename_output, 'r') as f:
print(f.read())


# Remove temporary file
remove(filename_output)

然后,将 Python 脚本的名称添加到。Git/config 和。Gitproperties 文件。

:

*.xls diff=xls

. git/config:

[diff "xlsx"]
textconv = python ./utils/xlsx_to_csv.py --input