61

比较文件时,我更喜欢使用git diff --color-words. 有没有办法在使用git add --patchor时使它成为差异的默认格式git add --interactive

4

9 回答 9

20

基于 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'
于 2016-06-14T16:19:40.367 回答
20

VonC 的回答中得到启发。以下是使用--interactivegit 2.9 中引入的选项的详细步骤。

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

如有必要,重新启动您的 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 --patchor git add -p

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

于 2016-10-01T21:44:35.987 回答
16

I recently solved this issue, but it requires modifying a Perl script in git. That's easy and requires no special skill, however.

This solution requires that your git configuration use colorization for screen output, because that's the only circumstance under which git will show a word-based diff.

  1. Copy git-add--interactive from your installation to somewhere in your PATH environment variable and rename it git-add--interactive-words.
  2. Edit a line about half way down to change*
@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);

to

@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --color-words --), $path);
  1. You can now run git add-interactive--words to do the equivalent of git add --interactive with colorized word-based diff.
  2. However, combining git add --patch with that is awkward because you need to pass the new script the right parameters. Fortunately, you can create an alias to the magic words in your .gitconfig:
[alias]
iaddpw = add--interactive-words --patch=stage --

which means git iaddpw runs the equivalent of git add --interactive --patch with colorized word-based diff.


*- For Git 2.18, this command is:

my @display_cmd = ("git", @diff_cmd, qw(--color --), $path);
于 2012-09-06T09:56:06.917 回答
11

使用 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 询问彩色差异,并将它们与我们应用的非彩色差异相关联。但是对于使用像 contrib 的 diff-highlight 这样的差异过滤器工具的人来说,没有任何方法可以看到他们的正常突出显示。

此补丁允许用户定义任意 shell 命令来通过管道传输彩色差异。确切的输出应该无关紧要(因为我们只是将结果显示给人类),只要它与原始 diff 行兼容(因此大块分割也可以分割彩色版本)。

然后,您可以将该差异通过管道传输到diff --color-words.

正如Andrew Dufresne所说GitHub 博客文章指的是 contrib脚本:contrib/diff-highlight

您可以使用“ --color-words”仅突出显示行的更改部分。然而,这对于代码来说通常很难阅读,因为它会丢失行结构,并且最终会得到格式奇怪的位。

相反,此脚本对面向行的差异进行后处理,找到成对的行,并突出显示不同的段。

结果特别强调了行的更改部分:

不同的颜色

关于这些差异,“ 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(Q2 2018)之前,“ interactive.diffFilter”使用的“ git add -i”必须保留其输入和输出之间的一一对应关系,但并未强制执行并导致最终用户混淆。

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

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


在 Git 2.30(2021 年第一季度)中,“ git add -iman未能遵守配置为显示补丁的自定义颜色,这已得到纠正。

请参阅提交 96386fa提交 890b68b提交 0cb8939提交 afae3cb提交 6681e36(2020 年 11 月 16 日)、提交 25d9e5c提交 c62cd17提交 6f1a5ca提交 decc9ee(2020 年 11 月 11 日)和提交 cb581b1 (2020 年 11 月 2日提交 d0204约翰内斯辛德林(dscho
(由Junio C Hamano 合并 -- gitster--提交 e0d2568中,2020 年 12 月 8 日)

add -p: 更color.diff.context喜欢color.diff.plain

签字人:约翰内斯·辛德林

Git 的差异机制允许用户覆盖在差异中使用的颜色,甚至是纯色的上下文行。从8dbf3eb6850 ( diff.h: rename DIFF_PLAINcolor slot to DIFF_CONTEXT,2015-05-27, Git v2.4.5) 开始,配置设置的首选名称是color.diff.context,尽管 Git 仍然允许color.diff.plain.

( man )的上下文中,这个逻辑有点难以复制:顺序读取所有配置值,如果它看到任何or ,它就会接受新颜色。 但是,Perl 版本的( man )需要经过( man ),它只允许指定一个键。( man ) 的内置版本也是如此,它必须通过。git add -pgit_diff_basic_config() color.diff.contextcolor.diff.plain
git add -pgit config --get-color
git add -prepo_config_get_value()

我们可以在这里做的最好的事情是寻找.context,如果没有找到,回退到寻找.plain,如果仍然没有找到,回退到硬编码的默认值(在这种情况下,它只是空字符串,作为上下文行通常不带颜色渲染)。

当使用两个配置名称时,这仍然会导致不一致:初始差异将由差异机制着色。一旦被用户编辑,一个大块必须由( man )
重新着色,然后使用其他设置为上下文行着色。git add -p

实际上,这并不是那么糟糕。(man手册在以下内容中说明了这一点git configcolor.diff.<slot>

`context` (context text - `plain` is a historical synonym)  

因此,我们应该假设用户使用其中一个名称,但不能同时使用两个名称。
此外,编辑后查看大块的情况相对不常见,因为默认情况下它会立即上演。

于 2016-04-05T21:21:54.853 回答
9

解决方案

用作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现在支持这个(从 v1.4.0 开始),因为https://github.com/so-fancy/diff-so-fancy/issues/35已经关闭。看到这个

于 2018-09-08T00:49:51.263 回答
4

如前所述,添加diff-highlightinteractive.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总是不断建议第一个修改的文件。

于 2017-12-11T12:01:56.493 回答
3

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

[core]
    pager = diffr | less -R
[interactive]
    diffFilter = diffr
于 2021-01-06T12:31:24.003 回答
1

这也可以通过delta实现:

[interactive]
    diffFilter = delta --color-only --features=interactive

并通过diff-so-fancy

[interactive]
    diffFilter = diff-so-fancy --patch
于 2021-10-01T04:22:51.860 回答
-5

在你的 $(HOME)/.gitconfig 文件中添加这个

[color]
        diff = auto
        interactive = auto

这应该做。

于 2012-06-04T08:37:31.540 回答