git: GUI の場合のみビジュアル diff (meld) を使用する

git: GUI の場合のみビジュアル diff (meld) を使用する

次のような外部 diff コマンドを指定できることはわかっていますgit diff:

[diff]
    external = 

しかし、コンソールにログインすると(Xなし)、ビジュアル差分がディスプレイを開くことができないため、これは失敗します(当然です)

GUI/X にログインしているときのみビジュアル diff を使用するように git に指示するにはどうすればよいですか?

答え1

これを実現するには、いくつかの簡単な方法があります。git の「外部」で実行するには、difftool プログラム (ビジュアル diff を起動するには、おそらく diff ではなく difftool を使用します) を、グラフィカル環境かどうかを判別して適切なプログラムを起動するラッパー スクリプトに設定できます。または、git の「内部」で、環境固有の条件付きインクルード (includeIf) を実行できます。

答え2

ご要望がありましたan answer drawing from credible and/or official sourcesので、この回答では公式文書を引用します。

まず、セッション内で実行されているかどうかを判断する方法を見つける必要がありますX 。たとえば、変数が設定されているかどうかを確認することでこれを行うことができます$DISPLAY 。次のように説明されていますman X

画面

これは唯一の必須環境変数です。X サーバーを指定する必要があります。上記の「表示名」セクションを参照してください。

DISPLAYしかし、誰かがの外側でも偽の値を設定する可能性があるため、これは良い考えではないかもしれません X。より良い方法が提案されています。この答え:

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi

お使いのマシンにという名前のプログラムがxhostすでにインストールされているはずですので、それがあることを確認してください:

$ type -a xhost
xhost is /usr/bin/xhost

ここで、diff.externalの内部にいる場合は外部 diff を呼び出し、の内部にいない場合はXデフォルトのメカニズムを実行する ラッパーを指すように を設定するだけで済みます。残念ながら、で デフォルトを実行する簡単な方法が思いつかないので、代わりに を使って を一時的に設定する のエイリアスを作成しましょう。 で説明されているように:git diffXgit diffdiff.externalgitdiff.external-cman git

-c <名前>=<値>

コマンドに設定パラメータを渡します。指定された値は設定ファイルの値を上書きします。git config でリストされているものと同じ形式 (ドットで区切られたサブキー) であることが期待されます。

git -c foo.bar ... で = を省略することは許可されており、foo.bar はブール値の true 値に設定されます (設定ファイルで [foo]bar がそうであるように)。等号を含めて空の値を指定すると (git -c foo.bar= ... のように)、foo.bar は空の文字列に設定されます。

それは次のようになります:

$ git -c diff.external=diff-wrapper.sh ...

総括する:

  • というスクリプトを作成し~/git-wrapper.sh<YOUR_DIFF_WRAPPER>任意のものに置き換えます。

    #!/usr/bin/env sh
    
    if xhost >/dev/null 2>&1
    then
        git -c diff.external=<YOUR_DIFF_WRAPPER>  "$@"
    else
        git "$@"
    fi
    
  • 実行ビットを設定します。

     $ chmod +x ~/git-wrapper.sh
    
  • たとえば、シェルの起動ファイルにエイリアスを設定し、~/.bashrcシェルをリロードします。

     alias git=~/git-wrapper.sh
    
  • 通常の使用git:

     $ git diff
    

    <YOUR_DIFF_WRAPPER>内部にいる場合はが使用され、外部ではXデフォルトが使用されます。git-diffX

関連情報