在git-diff的输出中着色空白部分

203

关于代码格式化,我有点纯粹主义 : )。我经常会删除不必要的空格(只有空格的行,行末的空格等)。我甚至已经设置了vim来显示那种颜色为红色的行。

我的问题是,使用git-diff时,我经常看到这样的东西:

-      else{ 
+      else{

即使我已经使用了git-diff彩色功能,但我仍然无法看到区别(在那种情况下,我删除了行末的1个空格)。有没有办法告诉git-diff将那个空格显示成红色?(例如与/\s+$/正则表达式匹配的那些)。


5
如果你反转颜色(交换前景和背景),类似这样的空格改变就会显示出来。在许多终端中实现这一点的简单方法是使用鼠标突出显示所需文本。当然,这个技巧仅适用于有着彩色差异的情况。 - Phlarx
请使用git config diff.wsErrorHighlight all,正如现在置顶的答案所解释的那样。 - sideshowbarker
1
如果您不想永久更改配置(或者喜欢一行命令),可以使用以下命令:git -c diff.wsErrorHighlight="all" diff - Cole
6个回答

231

Git 2.11(2016年第四季度)开始,您可以执行以下操作:

git config diff.wsErrorHighlight all

参见关于git diff的文档关于git config的文档


对于旧版本,您可以设置color.diff.whitespace配置设置,例如:

git config color.diff.whitespace "red reverse"

(我假设您已经将color.diffcolor.ui设置为auto,因为您说您已经从git diff中看到了彩色补丁。)如果您想要微调突出显示的红色空格错误的类型,那么您可以更改core.whitespace,但是blank-at-eol默认已启用,所以您可能不需要为您提到的示例更改它。可能会引起混淆的一个来源是,在git diff的输出中,只有引入的行中突出显示空格错误,而不是删除的行。(更新:正如Paul Whittaker在他的答案中指出的, 您应该点赞:))。您可以在git config man page中找到有关这些配置选项的更多文档。如果您不想使用-R把戏,您可以从diff man page中使用WhiteSpace Error Highlight选项。

--ws-error-highlight=

突出显示由color.diff.whitespace指定的颜色中指定行的空格错误。 是一个以逗号分隔的旧,新,上下文列表。 如果不给出此选项,则仅突出显示新行中的空格错误。 例如,--ws-error-highlight=new,old会在删除和添加的行上突出显示空格错误。 all可用作old,new,context的速记。

git diff --ws-error-highlight=new,old <file>

或者

git diff --ws-error-highlight=all <file>

对于早于2.11版本的版本,除了使用别名之外,没有办法永久打开并将其存储在配置中:

git config alias.df 'diff --ws-error-highlight=all'

现在您可以使用:

git df <file>

以红色查看更改。


34
在git diff的输出中,可能会引起混淆的一点是,只有新添加的行才会突出显示空格错误,而删除的行不会。没错!那么有没有办法也为删除的行显示呢?(嘿,毕竟这就是diff :)) - radarek
6
请在您的~/.gitconfig文件中的“set”后面添加“--global”。 - simlmx
17
你可以使用反向选项:git diff -R - blueyed
6
这个问题是否有错误报告?如果没有,似乎应该有一个。 - Ajedi32
5
这个命令 git config diff.wsErrorHighlight all 起作用了。使用 git config --global [...] 命令可以使更改全局生效(影响所有仓库)。 - Felipe Alvarez
显示剩余7条评论

161

使用git diff -R命令将被删除的行转换为添加的行,然后尾随空格将被突出显示。

(这假设您已经启用了空格高亮功能,按照Mark的答案中的颜色设置进行。此方法的信用归功于Junio在http://git.661346.n2.nabble.com/Highlighting-whitespace-on-removal-with-git-diff-td5653205.html发布的帖子。)

例如,当将文件从DOS换行符转换为Unix时,git diff -R清楚地显示我行末的^M字符的(消失)。如果没有使用-R(以及没有使用-w等选项),它会显示整个文件已更改,但不会显示如何更改。


5
当然,如果你非常着急,也可以使用git diff | cat -A | less -S命令,但是除了回车符外,cat命令还会将文本中包含的任何颜色突出显示的转义代码原样显示。 - Paul Whittaker
3
@Paul_Whittaker:cat -A 命令不是可移植的。在 BSD cat 中,没有这样的选项。请改用 cat -vet 命令。 - 7heo.tk

12

如果只是想快速了解答案,可以直接运行以下命令:

git config --global diff.wsErrorHighlight all

然后git diff也会在删除的行中突出显示末尾的空格。


11

请使用 git diff --color | less -R 命令。其中 -R 参数会让颜色控制码更容易阅读。

之后你可以使用 less 的正则表达式搜索功能,例如:

/[[:space:]]+$

顺便说一下,这个正则表达式在 vim 上也可以工作。 - Jose Alban
less -R 这个最后的想法,让我更容易把 ls --color 通过 less 进行管道传输。 - Menachem

0
上述命令还可以作为选项包含在gitconfig文件中,即使用以下方式:
git config ....

将相应选项添加到例如 ~/.gitconfig
[diff]
    wsErrorHighlight = all

[color]
    ui = auto

上述两个选项应该可以解决问题。我测试过的最早的git版本是1.7,但在此之后的任何版本中都应该适用。在较新的git版本中,“[color]”选项默认设置为“auto”。


0

我的版本的 git diff 似乎已经做到这一点 - 我有 git 1.7.4.1 并且设置了 color.ui = auto


13
我刚刚使用了 Git 1.7.5.1 进行测试,它确实没有在被删除的行中突出显示尾随空格。 - Infiltrator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接