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

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

我知道我可以指定外部 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 diffXgit diffdiff.externalgitdiff.external-cman 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-diffX

相關內容