![](/img/trans.png)
[英]How can I use `git diff --color-words` outside a Git repository?
[英]How to use --color-words with git add --patch?
比較文件時,我更喜歡使用git diff --color-words
。 使用git add --patch
或git add --interactive
時,有沒有辦法使它成為差異的默認格式?
建立在 VonC 所說的基礎上:
從 Git 2.9 開始,您可以在add --patch
期間使用此命令為單詞add --patch
:
git -c interactive.diffFilter="git diff --color-words" add -p
這將設置用於調用add -p
的interactive.diffFilter
變量,而不會影響進一步的調用。 對我來說,這是理想的,因為我通常想正常運行add -p
,但有時想用--color-words
運行它。
您可以輕松地為此命令添加別名,如下所示:
git config --global alias.addcw '-c interactive.diffFilter="git diff --color-words" add -p'
從VonC 的回答中得到提示。 以下是使用 git 2.9 中引入的--interactive
選項的詳細步驟。
將diff-highlight添加到您的 PATH。
在 Ubuntu 上, diff-highlight
隨 git 一起提供,可以在/usr/share/git/diff-highlight/diff-highlight
。
否則,您可以手動下載並設置它。
cd ~/bin
curl -LO "https://raw.githubusercontent.com/git/git/master/contrib/diff-highlight/diff-highlight"
chmod u+x diff-highlight
如有必要,重新啟動您的外殼。
然后配置 Git 以在它在尋呼機中顯示差異時過濾差異:
git config --global pager.log 'diff-highlight | less'
git config --global pager.show 'diff-highlight | less'
git config --global pager.diff 'diff-highlight | less'
git config --global interactive.diffFilter diff-highlight
這將額外強調一行的更改部分,這幾乎與--word-diff
相同。
優點是您可以在任何地方獲得 word diff,例如git log --patch
或git add -p
。
我最近解決了這個問題,但它需要在 git 中修改 Perl 腳本。 然而,這很容易,不需要特殊技能。
此解決方案要求您的 git 配置對屏幕輸出使用着色,因為這是 git 顯示基於單詞的差異的唯一情況。
git-add--interactive
從您的安裝復制到PATH
環境變量中的某個位置,並將其重命名為git-add--interactive-words
。@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);
到
@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --color-words --), $path);
git add-interactive--words
來執行與git add --interactive
相同的基於彩色單詞的差異。git add --patch
與它結合起來很尷尬,因為您需要向新腳本傳遞正確的參數。 幸運的是,您可以為.gitconfig
的魔法詞創建別名:[alias]
iaddpw = add--interactive-words --patch=stage --
這意味着git iaddpw
運行等效於git add --interactive --patch
並帶有基於單詞的彩色差異。
*-對於 Git 2.18,這個命令是:
my @display_cmd = ("git", @diff_cmd, qw(--color --), $path);
使用 git 2.9(2016 年 6 月),您將擁有一個新選項: interactive.diffFilter
。
請參閱Jeff King ( peff
) 的提交 0114384 (2016 年 2 月 27 日) 。
(由Junio C gitster
合並-- gitster
-- in commit 2052c52 ,2016 年 4 月 3 日)
add --interactive
: 允許自定義差異突出顯示程序
add--interactive 的補丁塊選擇器知道如何向 git 詢問彩色差異,並將它們與我們應用的未着色差異相關聯。 但是對於使用像 contrib 的 diff-highlight 這樣的 diff-filter 工具的人來說,沒有任何方法可以看到他們的正常突出顯示。
此補丁允許用戶定義任意 shell 命令來通過管道傳輸彩色差異。 確切的輸出應該無關緊要(因為我們只是向人類展示結果),只要它與原始差異行兼容(這樣大塊分割也可以分割彩色版本)。
然后,您可以將該差異通過管道傳輸到diff --color-words
。
正如Andrew Dufresne所評論的, GitHub 博客文章引用了 contrib 腳本contrib/diff-highlight
:
您可以使用“
--color-words
”僅突出顯示行的更改部分。 但是,這對於代碼來說通常很難閱讀,因為它會丟失行結構,並且最終會得到格式奇怪的位。相反,此腳本對面向行的差異進行后處理,查找行對,並突出顯示不同的段。
結果特別強調了一行的更改部分:
關於這些差異,“ diff-highlight
”過濾器(在contrib/
)學會了更好地git log --graph
“ git log --graph
”輸出。
請參閱Jeff King ( peff
) 的commit 4551fbb 、 commit 009a81e 、 commit fbcf99e 、 commit 7ce2f4c 、 commit e28ae50 、 commit 53ab9f0 、 commit 5013acc (2018 年 3 月 21 日) 。
(由Junio C gitster
合並-- gitster
-- in commit d19e556 ,2018 年 4 月 10 日)
在“ diff-highlight
:通過縮進檢測--graph
”中查看更多信息
注意:在 Git 2.17(2018 年第 2 季度)之前,“ git add -i
”使用的“ interactive.diffFilter
”必須保留其輸入和輸出之間的一一對應關系,但沒有強制執行並導致最終用戶混淆。
我們現在至少要確保過濾后的結果與輸入的行數相同,以檢測損壞的過濾器。
請參閱Jeff King ( peff
) 的commit 42f7d45和commit af3570e (2018 年 3 月 3 日) 。
(由Junio C gitster
合並-- gitster
-- in commit c5e2df0,2018年 3 月 14 日)
在 Git 2.30(2021 年第一季度)中,“ git add -i
” ( man )無法支持配置為顯示補丁的自定義顏色,該問題已得到糾正。
請參閱提交 96386fa , 提交 890b68b , 提交 0cb8939 , 提交 afae3cb , 提交 6681e36 (2020 年 11 月 16 日), 提交 25d9e5c , 提交 c62cd17 , 提交 6f1a5ca , 提交1 Nov, 204b , 提交1 Nov, 204b , 提交1 Nov, 204d ( c1 Nov, 204d ) 和約翰內斯· dscho
( dscho
) 。
(由Junio C gitster
合並-- gitster
--在提交 e0d2568 中,2020 年 12 月 8 日)
add -p
:喜歡color.diff.context
過color.diff.plain
簽字人:約翰內斯·辛德林
Git 的差異機制允許用戶覆蓋差異中使用的顏色,甚至是純色的上下文行。 從8dbf3eb6850 開始(
diff.h
: renameDIFF_PLAIN
color slot toDIFF_CONTEXT,
2015-05-27, Git v2.4.5),配置設置的首選名稱是color.diff.context
,盡管 Git 仍然允許color.diff.plain
.在
git add -p
( man )的上下文中,這個邏輯有點難以復制:git_diff_basic_config()
順序讀取所有配置值,如果它看到任何color.diff.context
或color.diff.plain
,它接受新的顏色。
但是,Perl 版本的git add -p
( man )需要通過git config --get-color
( man ) ,它只允許指定一個鍵。
git add -p
( man )的內置版本也是如此,它必須通過repo_config_get_value()
。我們在這里能做的最好的事情是查找
.context
,如果沒有找到,則返回尋找.plain
,如果仍然沒有找到,則返回到硬編碼的默認值(在這種情況下只是空字符串,因為上下文線通常在不着色的情況下呈現)。當使用兩個配置名稱時,這仍然會導致不一致:初始差異將由差異機制着色。
但是,一旦被用戶編輯,一個大塊頭必須通過git add -p
( man )重新着色,然后使用其他設置為上下文行着色。在實踐中,這是不是所有的壞。
git config
( man )手冊在color.diff.<slot>
:`context` (context text - `plain` is a historical synonym)
因此,我們應該假設用戶使用其中一個名稱,但不能同時使用這兩個名稱。
此外,編輯后查看大塊的情況相對不常見,因為默認情況下它會立即上演。
使用diff-highlight | less -FRX --tabs=4
diff-highlight | less -FRX --tabs=4
作為您的diffFilter
:
git -c interactive.diffFilter="diff-highlight | less -FRX --tabs=4" add --patch
如果您使用的是 Homebrew (OS X),您可以將以下內容放入您的.gitconfig
(以使用已安裝的diff-highlight
):
[interactive]
diffFilter = "$(git --exec-path | sed 's/libexec/share/')/contrib/diff-highlight/diff-highlight | less -FRX --tabs=4"
從 git 2.17 開始,單詞 diff 解決方案必須在輸入和輸出行之間保持 1-1 的對應關系,以避免:
$ git -c interactive.diffFilter="git diff --word-diff --color" add --patch
fatal: mismatched output from interactive.diffFilter
hint: Your filter must maintain a one-to-one correspondence
hint: between its input and output lines.
diff-so-fancy
還不支持這個: https : //github.com/so-fancy/diff-so-fancy/issues/35
如前所述,將diff-highlight
添加到interactive.diffFilter
配置鍵是最簡單的選項(自 Git 2.9 起)。 以下命令在 Debian/Ubuntu 上執行此操作,無需復制腳本、更改權限或修改 $PATH:
git config interactive.diffFilter "perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight"
諸如git -c interactive.diffFilter="git diff --color-words" add -p
或git config interactive.diffFilter "git diff --color-words"
不能正常工作: add -p
總是建議第一個修改后的文件。
這個工具做得很好https://github.com/mookid/diffr
[core]
pager = diffr | less -R
[interactive]
diffFilter = diffr
這也可以通過delta實現:
[interactive]
diffFilter = delta --color-only --features=interactive
並通過diff-so-fancy :
[interactive]
diffFilter = diff-so-fancy --patch
在你的 $(HOME)/.gitconfig 文件中添加這個
[color]
diff = auto
interactive = auto
這個應該可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.