git:僅在 GUI 中使用視覺差異(融合)
我知道我可以指定要用於的外部 diff 命令
git diff
:[diff] external =
但是當我登錄控制台(沒有X)時,這會失敗,因為我的視覺差異無法打開顯示(顯然)
我如何告訴 git 僅在登錄 GUI/X 時才使用視覺差異?
您要求,
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
指向一個包裝器,如果我們在裡面,它將呼叫外部差異,如果我們不在裡面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 將在配置文件中)。包括等於但具有空值(如 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
.
有幾種簡單的方法可以做到這一點……要在“外部”git 執行它,您可以將您的 difftool 程序(您可能需要 difftool 而不是 diff 來啟動視覺差異)設置為一個包裝腳本,以確定您是否是是否在圖形環境中並啟動適當的程序;或“內部”git,您可以執行一些特定於環境的條件包含(includeIf)。