10

我已经阅读了 Git Pro 网站,并且在 StackOverflow 上阅读了多个答案,但遗憾的是我根本无法让 .gitattributes 为我工作。

每当我使用git difftool时,它都会尝试显示二进制文件之间的差异,例如图像文件 (PNG)。

我在我的 .gitattributes 文件中尝试了多种组合,但是每当我运行我的git difftool命令时,它仍然会尝试比较二进制文件。

在我的存储库的文件夹中,我有:
.git
.gitattributes
[我的项目的文件子目录]

我为我的 .gitattributes 文件尝试了许多过滤器组合。例如:

*.pbxproj 二进制
*.png 二进制

或者还有:

*.pbxproj 二进制 -diff
*.png 二进制 -diff

甚至:

*.pbxproj 二进制
*.png 二进制
*.pbxproj -diff -difftool
*.png -diff -difftool

每次,我只需将我的 .gitattributes 文件添加到索引中并提交它。但是,这样做之后,当我运行 mygit difftool检查两个分支之间的差异时,会发生这种情况:

git difftool otherBranch HEAD

查看:“MyApp.xcodeproj/project.pbxproj”点击返回以启动“diffmerge”:

查看:“MyApp/Background1.png”点击返回以启动“diffmerge”:

它怎么会这样?如何最终正确设置我的 .gitattributes 文件,这样我就不必查看这些特定文件的差异?

为了进一步调查,我使用了git check-attr如下命令:
git check-attr binary MyApp/MainBackground.png

输出是MyApp/MainBackground.png: binary: set......我想知道为什么 git difftool 仍然强迫我查看差异!

4

2 回答 2

9

看起来这是 difftool 的一个缺陷。如果您按照描述使用 .gitattributes 文件,则“git diff”的输出将按预期进行修改,以便将任何 .proj 文件的输出设置*.proj binary*.proj -diff更改git diff为“二进制文件不同”。但是,difftool 似乎从不查看属性。我相信这是因为 difftool 基本上调用了与 mergetool 相同的代码,并且支持合并二进制文件(如果只是通过复制一个在另一个上)。附加的补丁是对 difftool-helper 脚本的一个小改动,应该会导致它跳过设置了二进制属性的文件。这可能是 git 邮件列表的东西。

--- git-difftool--helper    2011-06-03 21:48:08.000000000 +0100
+++ /opt/git/libexec/git-core/git-difftool--helper  2011-10-06 13:17:55.000000000 +0100
@@ -56,6 +56,10 @@
    fi
 }

+if test $(git check-attr diff "$1" | sed 's/.*diff: //') = 'unset'; then
+   echo skip binary file "\"$1\""
+else
+
 if ! use_ext_cmd; then
    if test -n "$GIT_DIFF_TOOL"; then
        merge_tool="$GIT_DIFF_TOOL"
@@ -70,3 +74,4 @@
    launch_merge_tool "$1" "$2" "$5"
    shift 7
 done
+fi
于 2011-10-06T12:19:03.397 回答
1

patthoyts回答对我有用。

对我来说,诀窍是弄清楚git-difftool--helpergit 正在使用的版本(MacPorts 安装了多个版本)

我用过(difftool打开):

lsof | grep "git-difftool--helper"
于 2012-11-08T02:51:00.980 回答