如何使用--color-words with git add --patch?

时间:2012-06-03 20:54:17

标签: git

在区分文件时,我更喜欢使用git diff --color-words。有没有办法在使用git add --patchgit add --interactive时将其设为差异的默认格式?

8 个答案:

答案 0 :(得分:17)

建立VonC所说的话:

从Git 2.9开始,您可以使用此命令在add --patch

期间为单词着色
git -c interactive.diffFilter="git diff --color-words" add -p

这会为interactive.diffFilter的呼叫设置add -p变量,而不会影响其他呼叫。对我而言,这是理想的,因为我通常希望正常运行add -p,但有时希望使用--color-words运行它。

您可以轻松地为此命令添加别名,如下所示:

git config --global alias.addcw '-c interactive.diffFilter="git diff --color-words" add -p'

答案 1 :(得分:16)

我最近解决了这个问题,但它需要在git中修改Perl脚本。但这很简单,不需要特殊技能。

此解决方案要求您的git配置使用颜色化进行屏幕输出,因为这是git显示基于单词的差异的唯一情况。

  1. git-add--interactive从您的安装中复制到PATH环境变量中的某个位置,并将其重命名为git-add--interactive-words
  2. 编辑一行大约一半以更改
  3. @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
    3. 中的魔术字创建别名
      [alias]
      iaddpw = add--interactive-words --patch=stage --
      

      表示git iaddpw使用彩色基于单词的差异运行等效于git add --interactive --patch

答案 2 :(得分:10)

VonC's answer获取提示。以下是使用git 2.9中引入的--interactive选项的详细步骤。

diff-highlight添加到您的路径中。

cd ~/bin
curl -LO "https://raw.githubusercontent.com/git/git/master/contrib/diff-highlight/diff-highlight"
chmod u+x diff-highlight

如果必须,请重新启动shell。

然后配置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几乎相同。

优点是你可以在git log --patchgit add -p处获得单词差异。

Demonstration of diff-highlight in git log --patch

答案 3 :(得分:9)

使用git 2.9(2016年6月),您将有一个新选项:interactive.diffFilter

commit 0114384Jeff King (peff)(2016年2月27日) (由Junio C Hamano -- gitster --合并于commit 2052c52,2016年4月3日)

  

add --interactive:允许自定义差异突出显示程序

     

add - interactive的补丁程序块选择器知道如何询问   git for colorized diffs,并将它们与   我们申请的无色差异。但是没有办法   有人使用像contrib这样的diff-filter工具   差异突出显示正常突出显示。

     

此补丁允许用户定义任意shell命令   管道彩色差异通过。确切的输出不应该   问题(因为我们只是向人类展示结果)只要   它与原始差异线性兼容(所以   hunk-splitting也可以拆分彩色版本。

然后,您可以将该差异传输到diff --color-words

commented作为Andrew DufresneGitHub blog post引用了贡献脚本contrib/diff-highlight

  

您可以使用“--color-words”仅突出显示已更改的部分   线。但是,对于代码而言,这通常很难阅读,因为它失败了   线结构,你最终得到奇怪的格式化位。

     

相反,此脚本对面向行的diff进行后处理,查找对   线条,并突出显示不同的部分。

结果更加强调了一行的变化部分:

diff colors

关于这些差异,“diff-highlight”过滤器(在contrib/中)学习了更好的“git log --graph”输出。

请参阅commit 4551fbbcommit 009a81ecommit fbcf99ecommit 7ce2f4ccommit e28ae50commit 53ab9f0commit 5013acc(2018年3月21日) Jeff King (peff) Junio C Hamano -- gitster --合并于commit d19e556,2018年4月10日)

请参阅“diff-highlight: detect --graph by indent

中的详情

注意:在Git 2.17(2018年第二季度)之前,“interactive.diffFilter”使用的“git add -i”必须在其输入和输出之间保持一对一的对应关系,但它没有强制执行,导致最终用户混淆。

我们现在至少确保过滤后的结果与输入的行数相同,以检测破碎的过滤器。

commit 42f7d45commit af3570eJeff King (peff)(2018年3月3日) (由Junio C Hamano -- gitster --合并于commit c5e2df0,2018年3月14日)

答案 4 :(得分:3)

如前所述,将diff-highlight添加到interactive.diffFilter配置密钥是最简单的选择(自Git 2.9起)。以下命令在没有复制脚本,更改权限或修改$ PATH的情况下在Debian / Ubuntu上执行了这个技巧:

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始终会建议修改第一个文件。

答案 5 :(得分:2)

这个工具做得很好https://github.com/mookid/diffr

[core]
    pager = diffr | less -R
[interactive]
    diffFilter = diffr

答案 6 :(得分:1)

解决方案

diff-highlight | less -FRX --tabs=4用作您的diffFilter

git -c interactive.diffFilter="diff-highlight | less -FRX --tabs=4" add --patch

有关diff-highlightsourcea quick primer

的更多信息

自制啤酒

如果您使用的是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

答案 7 :(得分:-6)

在$(HOME)/ .gitconfig文件中添加此

[color]
        diff = auto
        interactive = auto

应该这样做。