如何在 git 中区分二进制文件?

Nic*_*ack 52 diff git difftool

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

什么 difftools 工作?怎么把参数放进去?

Rol*_*ith 35

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

示例 1

假设您想比较 zip 文件的内容。在这种情况下,你应该把在下列文件中的一个$XDG_CONFIG_HOME/git/config$HOME/.gitconfig$GIT_DIR/config

[diff "zip"]
    textconv = unzip -v
Run Code Online (Sandbox Code Playgroud)

下次您要求对 repo 中的 zip 文件进行比较时,它将调用unzip -v两个版本并比较结果文本。

示例 2

对于 pdf 文件,您可以使用例如pdfinfo

[diff "pdf"]
    textconv = pdfinfo
Run Code Online (Sandbox Code Playgroud)

示例 3

如果文件类型没有特定的信息实用程序,您可以使用hexdump(随 FreeBSD 和 OSX 一起提供,也可在 Linux 上使用):

[diff "bin"]
    textconv = hexdump -v -C
Run Code Online (Sandbox Code Playgroud)

  • 在将 *.bin diff=bin 添加到我的 .gitattributes 之后,我终于让它起作用了 (10认同)
  • @nilskp您需要*两者*在`.gitconfig`文件中定义一个差异,并将该属性分配给`.gitattributes`中的路径。 (3认同)
  • 我在我的 git 配置中添加了示例 3,但是当我执行“git diff”时,它仍然只给我相同的短消息:“二进制文件 a/file 和 b/file 不同” (2认同)

小智 32

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

git diff --text
Run Code Online (Sandbox Code Playgroud)


pet*_*rjc 24

罗兰史密斯的回答很有帮助,但目前不完整(见评论)——这有两个部分。

您可以在存储库的.git/config文件或个人全局$XDG_CONFIG_HOME/git/config/.gitconfig(通常为 $HOME/.gitconfig)文件中定义新的 diff 命令,例如使用hexdump以下命令的 hex diff 命令:

[diff "hex"]
    textconv = hexdump -v -C
    binary = true
Run Code Online (Sandbox Code Playgroud)

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

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

.gitignore文件一样,该.gitattributes文件也应签入您的存储库。

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

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

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

  • 您也可以全局设置`.gitattributes`(与全局`.gitconfig` 中的`[diff]` 条目一起使用)。如果你将 `.gitattributes` 设置为本地仓库,那么用户将不得不修改他本地的 `.gitconfig` 仓库设置,因为出于安全原因,这些设置不会被推送到远程。无论哪种方式,每个用户都必须以某种方式更新他们的本地文件/配置以启用此行为。在 `[core]` 下的 `.gitconfig` 中,添加 `attributesfile = c:/users/<username>/.gitattributes` 或任何你想存储它的地方,如果你使它成为全局的(注意正斜杠,即使在 Windows 中)。 (4认同)

qwr*_*qwr 6

要创建一个二进制补丁,一个适用于二进制文件的补丁,而不仅仅是说“二进制文件不同”,请使用

git diff --binary file1 file2
Run Code Online (Sandbox Code Playgroud)

这会生成一个仅使用 ASCII 字符(与 不同)的“GIT 二进制补丁” --text,适合通过电子邮件发送。