为什么`git diff`没有调用外部差异工具?

Dan*_*ank 28 git diff meld

在我的存储库中,如果我输入

$ git diff some-file
Run Code Online (Sandbox Code Playgroud)

要么

$ git difftool some-file
Run Code Online (Sandbox Code Playgroud)

我得到了终端差异显示.我认为这不应该发生,因为我已经设置了一个外部差异工具,如输出所示git config -l:

$ git config -l
user.name=blah blah
user.email=blah blah
http.sslverify=true
diff.external=/home/daniel/bin/git-diff  <--This is the important line
push.default=simple
core.filemode=false
core.editor=gedit
alias.tree=log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)
         %C(black)[%cr]%C(reset)  %x09%C(black)%an: %s %C(reset)'
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=https://daniel@skynet/git/pyle.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.daniel.remote=origin
branch.daniel.merge=refs/heads/daniel
Run Code Online (Sandbox Code Playgroud)

diff.external行中引用的git-diff文件如下所示

#!/bin/bash

meld $2 $5
Run Code Online (Sandbox Code Playgroud)

为什么不git diff援引融合?

如果我设置git config -l了以下行,我会得到相同的行为:

diff.tool = meld
Run Code Online (Sandbox Code Playgroud)

要么

diff.external = usr/bin/meld
Run Code Online (Sandbox Code Playgroud)

注意:我的计算机上的其他存储库没有此问题.

相关但不等同的SO问题:

  1. git diff和之间有什么区别git difftool
  2. 无法使git diff使用diff.external作为外部diff工具

Von*_*onC 17

我得到了终端差异显示.我不应该这样,因为我已经设置了一个外部差异工具

是的,它应该:diff.external 为"在终端显示DIFF".

(来自git config手册页)

diff.external
Run Code Online (Sandbox Code Playgroud)

如果设置了此配置变量,则不使用内部diff机器执行diff生成,而是使用给定命令.
可以用GIT_EXTERNAL_DIFF环境变量覆盖.
使用git(1)中"git Diffs"下所述的参数调用该命令.注意:如果您只想在文件的子集上使用外部差异程序,则可能需要使用gitattributes(5).

你链接问题解释了为什么meld不能扮演"外部差异"的角色.

使用其他工具直观地查看差异是通过以下方式完成

git difftool --dir-diff shaOfHisCheckIn^!
git difftool --tool=meld --dir-diff shaOfHisCheckIn^!
git difftool -t meld -d shaOfHisCheckIn^!
Run Code Online (Sandbox Code Playgroud)

meld可以在Windows上配置为difftool:请参阅" Windows上的Git Diff和Meld ".


如果你想为git diff配置meld,你可以(在Ubuntu上)使用diff.external,但是使用包装器脚本:

git-diff.sh使用以下内容创建一个名为的文件:

#!/bin/bash
meld "$2" "$5" > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

将其保存到某个位置/usr/local/bin,并赋予其可执行权限:

$ sudo mv git-diff.sh /usr/local/bin/
$ sudo chmod +x /usr/local/bin/git-diff.sh
Run Code Online (Sandbox Code Playgroud)

最后一步是打开$HOME/.gitconfig文件并添加以下几行:

[diff]
        external = /usr/local/bin/git-diff.sh
Run Code Online (Sandbox Code Playgroud)

下次在带有更改的Git项目中键入git diff时,将启动Meld,显示拆分窗格差异查看器.
请注意,在打开下一个diff查看器之前,您需要关闭打开的meld实例.

  • `git difftool`似乎是解决方案.我尝试使用包装器脚本但由于某些原因不起作用. (4认同)

Tre*_*ude 14

似乎git diff(至少,从git版本开始1.7.12.4)将不会在处于"两个已修改"状态的文件上运行除内部的仅控制台差异之外的任何内容.git mergetool但是可以处理这些文件.

  • git版本1.9.1仍然如此,真烦人!我浪费了一个小时试图找出为什么我的diff工具的git配置设置突然停止工作. (2认同)
  • 仍然是`git version 2.5.4(Apple Git-61)`的情况.控制台只有3路合并工作流程是一个非常大的痛点.功能强大的控制台原生差异工具确实存在很大的不足.我相信我将采取的路径是允许git将冲突标记转储到文件中,然后使用我将编写的简单工具来处理这些工具以生成可读的diff输出. (2认同)
  • 啊哈!@ trebor-rude,你刚刚挽救了我的理智,想知道为什么我的difftool选择都没有奏效 (2认同)