簡體   English   中英

如何使用 --color-words 和 git 添加 --patch?

[英]How to use --color-words with git add --patch?

比較文件時,我更喜歡使用git diff --color-words 使用git add --patchgit add --interactive時,有沒有辦法使它成為差異的默認格式?

建立在 VonC 所說的基礎上:

從 Git 2.9 開始,您可以在add --patch期間使用此命令為單詞add --patch

git -c interactive.diffFilter="git diff --color-words" add -p

這將設置用於調用add -pinteractive.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 --patchgit add -p

git log --patch 中diff-highlight的演示

我最近解決了這個問題,但它需要在 git 中修改 Perl 腳本。 然而,這很容易,不需要特殊技能。

此解決方案要求您的 git 配置對屏幕輸出使用着色,因為這是 git 顯示基於單詞的差異的唯一情況。

  1. git-add--interactive從您的安裝復制到PATH環境變量中的某個位置,並將其重命名為git-add--interactive-words
  2. 編輯大約一半的行以進行更改*
@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);

@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --color-words --), $path);
  1. 您現在可以運行git add-interactive--words來執行與git add --interactive相同的基於彩色單詞的差異。
  2. 但是,將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 --graphgit log --graph ”輸出。

請參閱Jeff King ( peff ) 的commit 4551fbbcommit 009a81ecommit fbcf99ecommit 7ce2f4ccommit e28ae50commit 53ab9f0commit 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 42f7d45commit af3570e (2018 年 3 月 3 日
(由Junio C gitster合並-- gitster -- in commit c5e2df0,2018年 3 月 14 日)


在 Git 2.30(2021 年第一季度)中,“ git add -iman無法支持配置為顯示補丁的自定義顏色,該問題已得到糾正。

請參閱提交 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.contextcolor.diff.plain

簽字人:約翰內斯·辛德林

Git 的差異機制允許用戶覆蓋差異中使用的顏色,甚至是純色的上下文行。 8dbf3eb6850 開始diff.h : rename DIFF_PLAIN color slot to DIFF_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.contextcolor.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

有關diff-highlight更多信息: 快速入門

家釀

如果您使用的是 Homebrew (OS X),您可以將以下內容放入您的.gitconfig (以使用已安裝的diff-highlight ):

    [interactive]
        diffFilter = "$(git --exec-path | sed 's/libexec/share/')/contrib/diff-highlight/diff-highlight | less -FRX --tabs=4"

輸入輸出1-1對應關系

從 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 -pgit 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM