好みの diff ツール/ビューアで 'git diff' 出力を表示するにはどうすればいいですか? 質問する

好みの diff ツール/ビューアで 'git diff' 出力を表示するにはどうすればいいですか? 質問する

と入力するとgit diff、選択したビジュアル diff ツール (Windows では SourceGear の「diffmerge」) を使用して出力を表示したいのですが、これを行うには git をどのように設定すればよいでしょうか?

ベストアンサー1

Git1.6.3以降ではgit difftoolスクリプトが使用できます。私の答えは以下です


これはおそらく記事役に立ちます。ここで最も重要な部分を紹介します。

外部 diff ツールを指定するには 2 つの方法があります。

1 つ目は、GIT_EXTERNAL_DIFF 変数を設定するという、使用した方法です。ただし、この変数は実行可能ファイルのフル パスを指す必要があります。さらに、GIT_EXTERNAL_DIFF で指定された実行可能ファイルは、7 つの固定引数セットで呼び出されます。

path old-file old-hex old-mode new-file new-hex new-mode

ほとんどの diff ツールでは引数の順序が異なり (一部のみ)、必要な引数も異なるため、代わりにラッパー スクリプトを指定して、実際の diff ツールを呼び出す必要がある可能性が高くなります。

私が好む 2 番目の方法は、「git config」を介して外部 diff ツールを構成することです。私が実行したことは次のとおりです。

1) 次のような内容のラッパースクリプト「git-diff-wrapper.sh」を作成します。

-->8-(snip)--
#!/bin/sh

# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

ご覧のとおり、2 番目の引数 ("old-file") と 5 番目の引数 ("new-file") のみが diff ツールに渡されます。

2) タイプ

$ git config --global diff.external <path_to_wrapper_script>

コマンドプロンプトで「git-diff-wrapper.sh」へのパスに置き換えて、~/.gitconfigに以下が含まれるようにします。

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

ラッパースクリプトとdiffツールへのパスを指定するには、必ず正しい構文を使用してください。つまり、バックスラッシュではなくスラッシュを使用します。私の場合は、

[diff]
    external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"

.gitconfigで

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

ラッパー スクリプト内。末尾の「cat」に注意してください。

(' | cat' は、適切または一貫した戻りステータスを返さない可能性のある一部のプログラムにのみ必要だと思います。 diff ツールに明示的な戻りステータスがある場合は、末尾の cat なしで試してみるとよいでしょう)

ディオミディス・スピネリス追加コメント欄:

このcatコマンドは必須です。diff(1)は、ファイルが異なる場合、デフォルトでエラー コードで終了します。Git
は、外部 diff プログラムが、メモリ不足などの実際のエラーが発生した場合にのみエラー コードで終了することを想定しています。
の出力をgitにパイプすることでcat、非ゼロのエラー コードはマスクされます。
より効率的に、プログラムはexit引数 0 で実行できます。


それは(上記で引用した記事)設定ファイル(環境変数ではなく)を通じて定義される外部ツールの理論です。
実際には(外部ツールの設定ファイル定義については)、以下を参照できます。

おすすめ記事