【问题标题】:.gitattributes not making a difference, trying to skip files when using git difftool.gitattributes 没有区别,在使用 git difftool 时尝试跳过文件
【发布时间】:2011-09-30 08:20:31
【问题描述】:

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

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

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

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

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

*.pbxproj 二进制文件
*.png 二进制文件

也可以:

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

偶数:

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

每次,我只需将我的 .gitattributes 文件添加到索引并提交它。但是,这样做之后,当我运行 git 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 仍然强迫我查看差异!

【问题讨论】:

  • 您是否尝试将您的.gitattributes 文件与二进制文件直接放在同一目录中?
  • 我也有同样的问题。 “*.exe -crlf -diff”在我的 .gitattributes 中,但 git diff(设置为调用 meld,如 nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy 所述)仍然试图区分它。 .gitattributes 与 exe 文件位于同一目录中。
  • 我删除了 diff.external 配置设置,它没有任何区别。使用 .gitattributes 文件:diff 表示“二进制文件 a/xx.exe 和 b/xx.exe 不同”。没有文件,它说的完全一样。 (顺便说一句,我也尝试过使用 .git/info/attributes,但这也没有帮助。)
  • @VonC - .gitattributes 文件位于我的存储库的根文件夹中。二进制文件位于子文件夹中。有什么方法可以让我的 .gitattributes 文件递归地应用于子文件夹?
  • @hbCyber​​:gitattributes 指令集默认递归应用。但是,无论出于何种原因,这些指令在更高的目录中失败时,我总是在本地尝试相同的指令,在这些元素的直接父目录中。

标签: git diff difftool


【解决方案1】:

看起来这是 difftool 的一个缺陷。如果您按照描述使用 .gitattributes 文件,则“git diff”的输出将按预期进行修改,因此设置 *.proj binary*.proj -diff 会将任何 .proj 文件的 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

【讨论】:

  • 这是bug吗?2019年有这个问题
【解决方案2】:

patthoytsanswer 为我工作。

对我来说,诀窍是找出 git 使用的 git-difftool--helper 版本(MacPorts 安装了多个版本)

我用过(打开difftool):

lsof | grep "git-difftool--helper"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2015-11-30
    相关资源
    最近更新 更多