我知道我可以指定外部 diff 命令用於git diff
:
[diff]
external =
但是當我登入控制台(沒有 X)時,這會失敗,因為我的視覺差異無法打開顯示(顯然)
我該如何告訴 git 僅在登入 GUI/X 時才使用視覺差異?
答案1
有幾種簡單的方法可以完成此操作...要在git 之外執行此操作,您可以將difftool 程式(您可能需要difftool 而不是diff 來啟動視覺化差異)設定為包裝器腳本,該腳本可以確定您是否在圖形環境中並啟動適當的程式;或「內部」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 diff
X
git diff
diff.external
git
diff.external
-c
man git
-c <姓名>=<值>
將配置參數傳遞給命令。給定的值將覆蓋設定檔中的值。預期格式與 git config 列出的格式相同(子鍵以點分隔)。
請注意,允許省略 git -c foo.bar ... 中的 = 並將 foo.bar 設為布林真值(就像設定檔中的 [foo]bar 一樣)。包含 equals 但使用空值(如 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
例如,在 shell 啟動檔案中設定別名
~/.bashrc
並重新載入 shell:alias git=~/git-wrapper.sh
正常使用
git
:$ git diff
<YOUR_DIFF_WRAPPER>
如果您在內部,它將使用它,並且將在外部X
使用預設值。git-diff
X