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

Posted

技术标签:

【中文标题】在 git-diff 的输出中着色空白【英文标题】:Coloring white space in git-diff's output 【发布时间】:2011-07-12 13:38:48 【问题描述】:

关于代码格式,我有点纯粹:)。我经常删除不必要的空格(只有 ws 的行、行尾的 ws 等)。我什至已经设置 vim 来显示那种颜色为红色的线条。

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

-      else 
+      else

即使我有 git-diff 彩色,我也看不出区别(在那种特殊情况下,我在行尾删除了 1 ws)。有没有办法告诉 git-diff 显示 ws 着色为红色? (例如与 /\s+$/ 正则表达式匹配的那些)。

【问题讨论】:

如果你反转颜色(交换前景和背景),就会出现这样的空白变化。在许多终端中实现此目的的一种简单方法是用鼠标突出显示有问题的文本。当然,这个技巧只适用于彩色差异。 【参考方案1】:

您可能需要设置 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 指出的 in his answer,你应该投票赞成 :),你可以通过用 git diff -R 反转差异来看到这些。)

您可以在git config man page 中找到有关这些配置选项的更多文档

如果您不想使用 -R 混搭,您可以使用 diff man page 中的 WhiteSpace Error Highlight 选项。

--ws-error-highlight=

以 color.diff.whitespace 指定的颜色突出显示由 指定的行上的空白错误。 是逗号 旧、新、上下文的分隔列表。当没有给出这个选项时, 仅突出显示新行中的空白错误。例如。 --ws-error-highlight=new,old 突出显示删除行和添加行上的空白错误。 all 都可以用作简写 旧的,新的,上下文。

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

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

除了使用别名之外,我不知道有什么方法可以永久打开它并将其存储在配置中:

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

现在你可以使用了:

git df <file>

以红色查看变化。

注意with Git 2.11 (Q4 2016),这个别名可能会被替换为:

git config diff.wsErrorHighlight all

请参阅 doc on git diff 和 on git config

【讨论】:

“一个可能的混淆来源是在 git diff 的输出中,空白错误仅在引入的行中突出显示,而不是那些被删除的行。”确切地!对于已删除的行,也没有办法显示它? (嘿,这是不同的 :)) 添加 --global 以在你的 ~/.gitconfig 中设置 @radarek:您可以使用反向选项:git diff -R 有这方面的错误报告吗?如果没有,似乎应该有。 这工作git config diff.wsErrorHighlight all。使用 git config --global [...] 使更改全局化(即影响所有 repos)。【参考方案2】:

使用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 字符 (dis)。如果没有-R(也没有-w 等),则表明整个文件已更改,但不显示如何更改。

【讨论】:

当然,如果你不顾一切,你也可以使用git diff | cat -A | less -S,但除了回车之外,cat 还会显示任何颜色的字面高亮转义码。 @Paul_Whittaker cat -A 不可移植。在 BSD cat 上,没有这样的选项。请改用cat -vet【参考方案3】:

使用git diff --color | less -R-R 使颜色控制代码人性化。

那么就可以使用less的正则表达式搜索,例如

/[[:space:]]+$

【讨论】:

顺便说一句,这个正则表达式也适用于vim less -R 的最后一个想法让我更容易通过less 传递ls --color【参考方案4】:

对于懒惰的答案略读器,只需运行:

git config --global diff.wsErrorHighlight all

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

【讨论】:

【参考方案5】:

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

【讨论】:

我刚刚用 git 1.7.5.1 进行了测试,它肯定不会突出显示被删除行中的尾随空格。

以上是关于在 git-diff 的输出中着色空白的主要内容,如果未能解决你的问题,请参考以下文章

如何让 diff 像 git-diff 一样工作?

如何在 ARKit 中打印出着色器修改器输出?

如何从 git diff 读取输出?

如何从 git diff 读取输出?

在片段着色器中输出数据时切换布局位置

在Intellij产品中着色控制台输出