命令列下Git呼叫IDEA的diff功能

王bourne發表於2022-02-28

命令列下git diff, 有人歡喜有人厭, 本文以IDEA diff為例, 介紹如何更換Git的diff工具.

IDEA diff

IDEA作為一個圖形化工具, 其實也提供了極少一部分命令列介面, 將IDEA安裝目錄下的bin目錄新增到PATH環境變數中, 我們就可以在命令列中呼叫IDEA的命令了.

其中, IDEA的diff子命令, 需要兩個引數: leftright. 一般情況下, left為舊檔案, right為新檔案.

Git外部diff機制(Git external diff)

Git自帶了一個命令列的diff工具, 當然, 我們也可以自定義diff工具. 自定義的diff工具, 在git中叫做 Git external diff, 本文暫且稱其為 Git外部diff工具.
如果我們設定了外部diff工具的話, Git將會呼叫我們所設定的外部diff工具, 並傳遞7個引數:

  1. path 檔案的路徑
  2. old_file 舊檔案的路徑
  3. old_hex 舊檔案的SHA1
  4. old_mode 舊檔案的mode(檔案型別+檔案許可權)
  5. new_file 新檔案的路徑
  6. new_hex 新檔案的SHA1
  7. new_mode 新檔案的mode

設定Git external diff

設定外部diff工具有兩種方式, 兩種方式都是等價的, 設定其一即可:

  • 通過Git config命令設定: git config --global diff.external xxx
  • 通過環境變數GIT_EXTERNAL_DIFF設定: export GIT_EXTERNAL_DIFF=xxx

Git整合IDEA diff

IDEA diff只接受兩個引數, Git呼叫外部diff傳遞七個引數, 必然會導致問題, 所以我們寫個簡單的指令碼, 只把old_filenew_file傳遞給IDEA diff.

#!/bin/bash

path="$1"
old_file="$2"
old_hex="$3"
old_mode="$4"
new_file="$5"
new_hex="$6"
new_mode="$7"

idea diff "$old_file" "$new_file"

我們將指令碼儲存到任意位置, 指令碼命名為任意名字皆可, 例如命名為ideadiff.sh, 儲存到/home/wbourne/目錄下, 即可通過git config --global diff.external /home/wbourne/ideadiff.sh命令將其設定為外部diff工具, 再次在命令列中使用git diff時, 就會開啟IDEA的diff介面了.

在Windows中使用Git bash需注意碟符的問題, 可通過pwd命令檢視對映後的路徑, 如指令碼儲存在使用者家目錄下, 則命令應為: git config --global diff.external /c/Users/wbourne/ideadiff.sh

不只是IDEA diff, 只要是提供了命令列介面的diff工具, 都可將其設定為外部diff工具.

至此, 本文就基本結束了, 受限於篇幅, 本文只介紹了最簡陋的diff指令碼, 某些情況下是報錯的, 例如: 新增檔案, 刪除檔案. 感興趣的讀者, 可繼續自行完善此指令碼!

禁用外部diff工具

最後說一下如何禁用外部diff工具, 通過--no-ext-diff選項即可禁用外部diff工具, 即git diff --no-ext-diff.

參考

相關文章