我有一个二进制文件格式,将其包含在一个Git仓库中。我了解该二进制文件的格式,并且可以构建类似于差异比较工具,生成文本输出以便通过查看Git历史记录来查看差异。我甚至可以创建一个工具,接收原始的二进制文件和差异文本,并生成新的二进制文件,这样Git就不必保存多次带有微小变化的二进制文件。
如果我要创建这些类型的工具,我应该如何将它们与Git集成?
我有一个二进制文件格式,将其包含在一个Git仓库中。我了解该二进制文件的格式,并且可以构建类似于差异比较工具,生成文本输出以便通过查看Git历史记录来查看差异。我甚至可以创建一个工具,接收原始的二进制文件和差异文本,并生成新的二进制文件,这样Git就不必保存多次带有微小变化的二进制文件。
如果我要创建这些类型的工具,我应该如何将它们与Git集成?
来自git help config
:
diff.external
If this config variable is set, diff generation is not performed
using the internal diff machinery, but using the given command. Can
be overridden with the ‘GIT_EXTERNAL_DIFF’ environment variable.
The command is called with parameters as described under "git
Diffs" in git(1). Note: if you want to use an external diff program
only on a subset of your files, you might want to use
gitattributes(5) instead.
gitattributes(5)
还提到了一种机制叫做 textconv
:你可以提供一个将二进制文件转换为文本摘要的程序,而不是提供一个 diff 程序;然后通常的 git diff 机制就会用来呈现这些文本摘要的差异。
编辑:我不知道如何让低级别的对象打包程序使用自定义的 diff 工具。从低级别的 git-pack-objects(1)
手册中可以看出,底层的打包格式似乎使用了一种二进制 diff 格式,该格式会自适应地搜索现有的对象以构建二进制增量,以避免存储整个新对象。在这个级别上,对象(文件)只是二进制块,除了最模糊的情况外,我认为最好将对象打包内容视为实现细节。
换句话说,如果你的二进制对象在二进制级别上相似,它们将被 git 自动有效地表示。我能想象到的常见情况是压缩和加密文件,这种情况下可能不成立。