web-dev-qa-db-ja.com

なぜ `git diff`は外部diffツールを呼び出さないのですか?

私のリポジトリで、入力した場合

$ git diff some-file

または

$ git difftool some-file

ターミナル内の差分表示を取得します。 git config -lの出力に示されているように、外部diffツールを設定しているため、これは起こるべきではないと思います。

$ 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がmeldを呼び出さないのはなぜですか?

git config -lに次の行があるように設定すると、同じ動作になります。

diff.tool = meld

または

diff.external = usr/bin/meld

:私のマシンの他のリポジトリにはこの問題はありません。

関連するが、同等ではないSOの質問:

  1. git diffgit difftoolの違いは何ですか?
  2. git diffで外部diffツールにdiff.externalを使用することはできません
27
DanielSank

ターミナル内の差分表示を取得します。私は外部diffツールを設定したので、これは起こるべきではありません

はい、そうすべきです:diff.externalis「in-terminal diff display」.

git config manページから

diff.external

この構成変数が設定されている場合、diffの生成は内部diff機構ではなく、指定されたコマンドを使用して実行されます。
GIT_EXTERNAL_DIFF環境変数で上書きできます。
このコマンドは、git(1)の「git Diffs」で説明されているパラメーターを使用して呼び出されます。注:ファイルのサブセットでのみ外部diffプログラムを使用する場合は、代わりに gitattributes(5) を使用できます。

リンクする質問 は、meldが「外部diff」の役割を果たせない理由を説明しています。

別のツールで差分を視覚的に表示する は次のようにして行います:

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

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

これを/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インスタンスを閉じる必要があることに注意してください。

16
VonC

のようだ git diff(少なくとも、gitバージョン1.7.12.4) "both modified"状態のファイルに対して、内部のコンソールのみのdiff以外は実行しません。 git mergetoolはそのようなファイルでも動作します。

14
Trebor Rude

通常、チェックインしようとしている変更が正しいかどうかを確認したいだけです。そこで、提案された手順に従いました here (VonCが指摘したものと同様)。ただし、git difftoolまだメルドを開けていません。次に、エイリアスを作成しました。

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

これを.bashrcまたは.zshrcまたはシェルの対応する構成に保存します。これは本質的に、ブランチの状態をブランチ上の以前のコミットと比較します。

git-diffファイルごとにファイルごとの変更を表示するか、git-diff --dirディレクトリビューですべての変更を表示します。

2
Lodewyk