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

myb*_*ael 47 git

在区分文件时,我更喜欢使用git diff --color-words.有没有一种方法使用时,使本作的diff的默认格式git add --patchgit add --interactive

adz*_*ith 20

建立VonC所说的:

从Git 2.9开始,您可以使用此命令在以下期间为单词着色add --patch:

git -c interactive.diffFilter="git diff --color-words" add -p
Run Code Online (Sandbox Code Playgroud)

这将设置interactive.diffFilter调用的变量,add -p而不会影响其他调用.对我来说这是理想的,因为我通常想要add -p正常运行,但有时候想要运行它--color-words.

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

git config --global alias.addcw '-c interactive.diffFilter="git diff --color-words" add -p'
Run Code Online (Sandbox Code Playgroud)

  • 从命令行工具在macOS上的Git 2.17.2,我看到“致命:interactive.diffFilter的输出不匹配提示:您的过滤器必须在输入和输出行之间保持一一对应的提示。” (4认同)
  • 就像已经指出的那样,答案(可悲的是)**错误**,因为使用的命令`git diff --color-words`不会对标准输入着色,但通常会执行get。只需执行`echo test | git diff` 或 `git show <some-older-commit> | git diff` 获取证据。 (2认同)

mab*_*ham 16

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

这个解决方案要求你的git配置使用colorization进行屏幕输出,因为这是git显示基于单词的diff的唯一情况.

  1. git-add--interactive从安装中复制到PATH环境变量中的某个位置并重命名git-add--interactive-words.
  2. 编辑大约一半的线来改变
@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);
Run Code Online (Sandbox Code Playgroud)

@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --color-words --), $path);
Run Code Online (Sandbox Code Playgroud)
  1. 您现在可以运行git add-interactive--wordsgit add --interactive使用基于颜色的基于单词的差异.
  2. 但是,git add --patch与此相结合是不方便的,因为您需要传递新脚本正确的参数.幸运的是,您可以为您的魔术词创建一个别名.gitconfig:
[alias]
iaddpw = add--interactive-words --patch=stage --
Run Code Online (Sandbox Code Playgroud)

这意味着git iaddpw运行相当于git add --interactive --patch彩色基于字的差异.

  • @BPm @mabraham:您可以通过使用if语句围绕第1339行(这是`print;`)来压制该消息,以确保定义`$ _`,即用`if($ _){print;替换第1339行.}` (5认同)
  • 聪明.你应该向Git提交一个补丁.谢谢. (3认同)
  • 我的论文提交后;-) (3认同)
  • 第1270-1340行中的现有着色代码假定"之前"和"之后"的内容具有内容,这不一定是这种情况.来自@Nevik的修复在那里和第1282行有效. (3认同)
  • @mabraham但是我得到了这个警告:`在/usr/local/Cellar/git/1.8.0/libexec/git-core/git-add--interactive-words line 1339`中使用未初始化的值$ _但是使用`git add -p`没有给我那个警告 (2认同)

And*_*sne 11

VonC的回答中得到启示.以下是使用--interactivegit 2.9中介绍的选项的详细步骤.

diff-highlight添加到PATH中.

cd ~/bin
curl -LO "https://raw.githubusercontent.com/git/git/master/contrib/diff-highlight/diff-highlight"
chmod u+x diff-highlight
Run Code Online (Sandbox Code Playgroud)

如果必须,重新启动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
Run Code Online (Sandbox Code Playgroud)

这将特别强调一条线的变化部分,这几乎与一条线相同--word-diff.

优点是你可以在每个地方获得单词diff,比如git log --patchgit add -p.

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

  • 您应该已经在 git 安装中附带了 diff-highlight。 (2认同)

Von*_*onC 9

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

请参阅Jeff King()提交的0114384(2016年2月27日).(由Junio C Hamano合并- -提交2052c52,2016年4月3日)peff
gitster

add --interactive:允许自定义差异高亮显示程序

add - interactive的补丁程序块选择器知道如何向git请求彩色差异,并将它们与我们应用的未着色差异相关联.但对于那些使用像diff的diff-highlight这样的diff-filter工具来看他们正常的突出显示的人来说,没有任何办法.

此修补程序允许用户定义任意shell命令以管理彩色差异.确切的输出应该无关紧要(因为我们只是向人类显示结果),只要它与原始的diff是线性兼容的(因此,hunk-splitting也可以分割彩色版本).

然后你可以将diff传递给a diff --color-words.

正如Andrew Dufresne 评论的那样,GitHub博客帖子引用了contrib脚本:contrib/diff-highlight

您可以使用" --color-words"仅突出显示已更改的线条部分.但是,对于代码来说,这通常很难读取,因为它会丢失行结构,并且最终会出现奇怪的格式化位.

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

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

差异颜色

关于那些差异," diff-highlight"过滤器(in contrib/)学会了git log --graph更好地进行"输出".

请参阅Jeff King()提交4551fbb,提交009a81e,提交fbcf99e,提交7ce2f4c,提交e28ae50,提交53ab9f0,提交5013acc(2018年3月21日).(由Junio C Hamano合并- -提交d19e556,2018年4月10日)peff
gitster

见多" diff-highlight:检测--graph由缩进 "


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

我们现在至少确保过滤结果的行数与其输入相同,以检测损坏的过滤器.

Jeff King()提交42f7d45,提交af3570e(2018年3月3日).(由Junio C Hamano合并- -提交c5e2df0,2018年3月14日)peff
gitster


Oli*_*och 8

解决方案

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

git -c interactive.diffFilter="diff-highlight | less -FRX --tabs=4" add --patch
Run Code Online (Sandbox Code Playgroud)

有关更多信息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"
Run Code Online (Sandbox Code Playgroud)

输入输出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.
Run Code Online (Sandbox Code Playgroud)

diff-so-fancy现在支持这个(从 v1.4.0 开始),因为https://github.com/so-fancy/diff-so-fancy/issues/35已经关闭。看到这个


小智 5

如前所述,添加diff-highlightinteractive.diffFilter配置键是最简单的选项(自 Git 2.9 起)。以下命令可以在 Debian/Ubuntu 上实现此目的,无需复制脚本、更改权限或修改 $PATH:

git config interactive.diffFilter "perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight"
Run Code Online (Sandbox Code Playgroud)

git -c interactive.diffFilter="git diff --color-words" add -p诸如或git config interactive.diffFilter "git diff --color-words"无法正常工作之类的事情:add -p总是不断建议第一个修改的文件。