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

时间:2014-07-26 00:17:57

标签: git diff meld

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

$ git diff some-file

$ git difftool some-file

我得到了终端差异显示。我认为这不应该发生,因为我已经设置了一个外部差异工具,如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

diff.external行中引用的git-diff文件看起来像这样

#!/bin/bash

meld $2 $5

为什么不git diff调用融合?

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

diff.tool = meld

diff.external = usr/bin/meld

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

相关但不等同的SO问题:

  1. What is the difference between git diff and git difftool?
  2. Cannot make git diff use diff.external for external diff tool

3 个答案:

答案 0 :(得分:16)

  

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

是的,它应该:diff.external 用于&#34;终端内差异显示&#34;。

(来自git config man page

diff.external
  

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

question you link解释了为什么meld无法发挥&#34;外部差异&#34;的作用。

Viewing a diff visually with another tool完成了:

git difftool --dir-diff shaOfHisCheckIn^!
git difftool --tool=meld --dir-diff shaOfHisCheckIn^!
git difftool -t meld -d shaOfHisCheckIn^!

meld可以在Windows上配置为difftool:请参阅&#34; Git Diff and Meld on Windows&#34;。


如果你想为git diff配置meld,你可以(on Ubuntu) use the diff.external, but with a wrapper script

  

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

#!/bin/bash
meld "$2" "$5" > /dev/null 2>&1
  

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

$ sudo mv git-diff.sh /usr/local/bin/
$ sudo chmod +x /usr/local/bin/git-diff.sh
  

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

[diff]
        external = /usr/local/bin/git-diff.sh
  

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

答案 1 :(得分:14)

似乎git diff(至少,从git版本1.7.12.4开始)除了内部的,仅限控制台的差异外,不会运行“两者都修改了“状态。 git mergetool可以处理此类文件。

答案 2 :(得分:2)

我通常只是想检查一下我要检查的更改是否正确。所以我按照建议的here程序(类似于VonC提到的程序)。但是,运行git difftool仍然没有打开融合。然后我创建了一个别名:

alias git-diff='git difftool $(git rev-parse HEAD)'

将此保存在.bashrc或.zshrc或shell的相应配置中。这实质上是将分支的状态与分支上的先前提交进行比较。

执行git-diff以查看每个文件的文件更改或git-diff --dir以查看目录视图中的所有更改。