Git

git:僅在 GUI 中使用視覺差異(融合)

  • November 30, 2017

我知道我可以指定要用於的外部 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 diffdiff.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並替換 &lt;YOUR_DIFF_WRAPPER&gt;為您想要的任何內容:
#!/usr/bin/env sh

if xhost &gt;/dev/null 2&gt;&1
then
   git -c diff.external=&lt;YOUR_DIFF_WRAPPER&gt;  "$@"
else
   git "$@"
fi
  • 設置一個可執行位:
$ chmod +x ~/git-wrapper.sh
  • 在您的 shell 啟動文件中設置別名,例如~/.bashrc並重新載入 shell:
alias git=~/git-wrapper.sh
  • 正常使用git
$ git diff

&lt;YOUR_DIFF_WRAPPER&gt;如果您在裡面X,它將使用它,並將git-diffX.

有幾種簡單的方法可以做到這一點……要在“外部”git 執行它,您可以將您的 difftool 程序(您可能需要 difftool 而不是 diff 來啟動視覺差異)設置為一個包裝腳本,以確定您是否是是否在圖形環境中並啟動適當的程序;或“內部”git,您可以執行一些特定於環境的條件包含(includeIf)。

引用自:https://unix.stackexchange.com/questions/406946