如何在git中比较二进制文件?


28

为了在git中比较二进制文件,我假设我需要设置一个difftool。

哪些difftools有效?如何输入参数?


您期望从二进制文件的diff工具获得什么样的输出?这是哪种二进制文件?是否可以将其呈现为文本格式然后进行比较?
Zoredache 2014年

Answers:


22

您可以textconv为文件类型设置配置选项。请参见gitattributes(5)中的 “执行二进制文件的文本差异” 。您应该使用哪种取决于文件类型。

范例1

假设您要比较zip文件的内容。在这种情况下,应将以下内容放在$ GIT_DIR / config文件或$ HOME / .gitconfig中。

[diff "zip"]
    textconv = unzip -v

下次您在存储库中要求对zip文件进行比较时,它将unzip -v同时调用这两个版本,并比较结果文本。

范例2

对于pdf文件,您可以使用eg pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

例子3

如果文件类型没有特定的信息实用程序,则可以使用hexdump(例如FreeBSD和OSX附带,在Linux上也可用):

[diff "bin"]
    textconv = hexdump -v -C

我可以用十六进制表示。只要知道多少个字节不同或字节在什么位置不同,我就很高兴。我最终通过克隆git存储库来使用Hex Fiend,因此我可以检出文件的两个版本,因为我不知道如何获取git来启动程序。
Nick Retallack 2014年

@NickRetallack:请参阅添加的示例。
罗兰·史密斯

2
我将示例3添加到我的git配置中,但是当我执行“ git diff”时,它仍然只给我相同的短消息:“二进制文件a / file和b / file不同”
Nick Retallack

1
如果您想使用libmagic,则必须查看git源代码,看看它是否有效……
Roland Smith

5
在将* .bin diff = bin添加到我的.gitattributes中之后,我终于使它起作用了
Justin Rowe

11

罗兰·史密斯(Roland Smith)的回答很有帮助,但目前尚不完整(请参阅评论)-分为两个部分。

您可以在存储库的.git/config文件或个人全局~/.gitconfig文件中定义新的diff命令,例如,使用的十六进制diff命令hexdump

[diff "hex"]
    textconv = hexdump -v -C
    binary = true

接下来,您需要使用存储库的.gitattributes文件来告诉git该特殊的diff命令应使用哪些文件:

# Binary files (no line-ending conversions), diff using hexdump
*.bin binary diff=hex

.gitignore文件一样,.gitattributes应将文件检入到存储库中。

就我而言,我有几种不同的文件扩展名,我希望将其视为二进制文件(例如,如果在Windows上使用git,请避免任何行尾转换),并且还可以通过hexdump以下方式查看任何差异:

https://github.com/peterjc/galaxy_blast/commit/5ec4695e6c3da3926fb100ca006f0f3e88c53c3d

另请参阅https://github.com/resin-io/etcher/pull/1367,以获取定义用于图像文件的hexdump diff命令的另一个示例。


您也可以设置.gitattributes全局(与[diff]global中的条目一起使用.gitconfig)。如果您将.gitattributes本地存储库设为存储库,则用户将不得不修改其本地存储.gitconfig库设置,因为出于安全原因,这些设置不会被推送到远程。无论哪种方式,每个用户都必须以某种方式更新其本地文件/配置以启用此行为。在.gitconfig下面[core]添加attributesfile = c:/users/<username>/.gitattributes或任何你想要保存它,如果你让全球(注意forwardslashes,即使在窗户)。
LightCC

10

如果要强制git将二进制文件diff显示为纯文本diff,请使用以下--text选项:

git diff --text

-1

上面是完成此操作的综合方法。.但是,如果您只需要对几个文件进行操作,则可以使用以下方法:

git checkout HEAD -- /path/to/file > ~/file
vimdiff ~/file /path/to/file

我在这里使用,vimdiff但是您可以使用任何其他工具。如果您需要一遍又一遍地执行上述操作,也可以将其组合成一个小的脚本。


这似乎已经放弃了对我的文件的更改(并在我希望提交的版本所在的位置创建了一个空文件)。
Erhannis
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.