本文將介紹, 如何在命令行下, 讓git diff命令調用IDEA的diff功能!
IDEA diff
IDEA雖然是一個圖形化工具, 其實也提供了極少一部分命令行接口, 將IDEA安裝目錄下的bin目錄添加到PATH環境變量中, 我們就可以在命令行中調用IDEA的命令了.
通過查看幫助得知, idea diff <left> <right>
可以調用IDEA比較兩個文件. left
和right
為文件的路徑.
Git外部diff機制(Git external diff)
Git自帶了一個命令行的diff工具, 當然, 我們也可以自定義diff工具. 自定義的diff工具, 在git中叫做 Git external diff, 本文暫且稱其為 Git外部diff工具.
如果我們設置了外部diff工具的話, Git將會調用我們所設置的外部diff工具, 並傳遞7個參數:
path
文件的路徑old_file
舊文件的路徑old_hex
舊文件的SHA1old_mode
舊文件的mode(文件類型+文件權限)new_file
新文件的路徑new_hex
新文件的SHA1new_mode
新文件的mode
假設我們將xxx
設置為Git外部diff工具, 當我們執行任意一條git diff ...
命令時, git就會調用xxx
, 並傳遞給xxx
7個參數, 相當於自動執行了xxx path old_file old_hex old_mode new_file new_hex new_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_file
和new_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工具
- 如果只是想臨時禁用外部diff工具, 通過
--no-ext-diff
選項即可禁用外部diff工具, 即git diff --no-ext-diff ...
- 如果想永久禁用外部diff工具, 有兩種方式, 取消
GIT_EXTERNAL_DIFF
環境變量或者執行git config --global --unset diff.external
刪除配置, 具體采用哪種方式, 取決於設置外部diff工具時的方式