我有一个包含在 git 存储库中的二进制文件格式。我知道二进制文件的文件格式,并且可以想象为它们创建一个类似 diff 的工具,它会产生一个文本输出,所以当我查看 git 历史记录时我可以看到差异。我什至可以创建一个可以获取原始二进制文件和差异文本的工具,然后创建新的二进制文件,这样 git 就不必一遍又一遍地保存二进制文件,只需进行小的更改。
如果我要制作这些类型的工具,我如何将它与 git 集成?
我有一个包含在 git 存储库中的二进制文件格式。我知道二进制文件的文件格式,并且可以想象为它们创建一个类似 diff 的工具,它会产生一个文本输出,所以当我查看 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
:您提供一个将二进制文件转换为文本摘要的程序,而不是提供差异程序;然后使用正常的 git diff 机制来呈现这些文本摘要的差异。
编辑:我不知道有什么方法可以让低级对象打包例程使用自定义差异工具。从底层手册页的字里行间git-pack-objects(1)
看,似乎底层的包格式使用了二进制差异格式,它自适应地搜索现有对象以构造二进制增量,以避免存储整个新对象。在这个级别上,对象(文件)只是二进制 blob,我认为除了最模糊的情况外,最好将对象打包的东西视为实现细节。
换句话说,如果您的二进制对象在二进制级别上彼此相似,它们将由 git 自动有效地表示。我能想象到的常见情况是压缩和加密文件。