如何自定义git diff中diff头的颜色?

37

当我运行 git diff 命令时,每个差异的标题部分都是白色文本。由于我使用的是浅色背景,所以很难阅读,因此我想要更改它。

我发现可以通过以下方式(在.gitconfig文件中)更改输出的其他颜色:

[color "diff"]
    old = green
    new = red

但我不知道该在标题颜色处放置什么。更好的是,有没有地方记录所有默认的git config设置?

我所说的“diff header”是指像这样的行:

diff --git a/README.md b/README.md
index f102026..c5e3428 100644
--- a/README.md
+++ b/README.md
4个回答

44
尝试设置color.diff.meta,例如。
git config --global color.diff.meta blue

或通过手动编辑配置文件

[color "diff"]
    meta = blue

你可以查看 git-config 参考文档中各种颜色设置的更多可能设置。这里列出了color.diff.meta设置:

color.diff.<slot>
使用自定义颜色进行差异着色。<slot>指定要使用指定颜色的补丁的哪个部分,并且是以下之一:plain(上下文文本),meta(元信息),frag(块标题),func(块标题中的函数),old(已删除行),new(已添加行),commit(提交头)或whitespace(突出显示空格错误)。 这些变量的值可以像color.branch.<slot>中那样指定。


很好的回答,但我也想改变新行和旧(删除)行的颜色,所以我进行了研究,并在这里扩展了您的答案:https://dev59.com/jF8d5IYBdhLWcg3wVQ-9#61993060 - Gabriel Staples
1
或者,如果您想避免更改全局配置(可能只需一次):git -c color.diff.meta=blue diff <file1> <file2> - Cole
太棒了!像我这样的色盲人可以这样做:git config --global color.diff.old blue - Jose Luis Blanco

17

通过谷歌搜索 "git diff change colors",这个问题成为了首选,所以让我添加一些相关信息。我来到这里寻找答案,现在我已经找到了,知道其他人也会来到这里寻找同样的信息。

git diff基础颜色选项:

  1. meta = header information (white by default), that looks like this:

     diff --git a/home/.bashrc b/home/.bashrc
     index 148212d..a0d16d8 100644
     --- a/home/.bashrc
     +++ b/home/.bashrc
    
  2. old = deleted lines (red by default)

  3. new = added lines (green by default)

像这样在您的全局gitconfig文件~/.gitconfig中更改这些颜色:

git config --global color.diff.meta blue
git config --global color.diff.old blue
git config --global color.diff.new blue

或通过直接编辑 ~/.gitconfig 并添加这些行:

[color "diff"]
    meta = blue
    old = blue
    new = blue

如需了解更多颜色设置或可更改的“槽位”,请查看 man 手册页面:

man git config

或者在这里在线查看,并搜索color.diff.<slot>

我可以使用哪些颜色?

请参阅man git config中的color部分,或者在这里在线查看:https://git-scm.com/docs/git-config#Documentation/git-config.txt-color

变量取颜色的值是一个颜色列表(最多两个,一个用于前景,一个用于背景)和属性(尽可能多),由空格分隔。接受的基本颜色为正常、黑色、红色、绿色、黄色、蓝色、品红色、青色和白色。给出的第一种颜色是前景色,第二种颜色是背景色。除正常之外的所有基本颜色都有一个亮色变体,可以用bright前缀指定,例如brightred。颜色也可以以0到255之间的数字给出;这些使用ANSI 256色模式(但请注意,并非所有终端都支持此功能)。如果您的终端支持,您还可以指定24位RGB值作为十六进制值,例如#ff0ab3。接受的属性为bold、dim、ul、blink、reverse、italic和strike(用于带有中划线或“删除”字母的穿越)。与颜色相关联的任何属性的位置(在颜色之前、之后或之间)并不重要。特定的属性可以通过在其前缀中添加no或no-来取消(例如noreverse、no-ul等)。空的颜色字符串根本不产生颜色效果。这可用于避免对特定元素进行着色而不完全禁用颜色。对于git的预定义颜色插槽,属性应在彩色输出中每个项目的开头重置。因此,将color.decorate.branch设置为black将以纯黑色绘制该分支名称,即使同一输出行上的前一个内容(例如log --decorate输出中的分支名称列表之前的左括号)设置为用粗体或其他属性绘制。但是,自定义日志格式可能会进行更复杂和分层着色,并且否定形式可能在那里有用。
更复杂的示例,具有前景色、背景色和文本属性(bold、italic、strike-through):
这里是一个更复杂的示例。第一种颜色是前景色,第二种颜色是背景色,其后的任何单词都是属性。有关详细信息,请参见上述引用的手册页。
运行以下命令:
git config --global color.diff.meta "blue"
git config --global color.diff.old "black red strike"
git config --global color.diff.new "black green italic"
git config --global color.diff.context "yellow bold"

将以下内容复制/粘贴到您的~/.gitconfig文件的底部:

[color "diff"]
    meta = blue
    old = black red strike
    new = black green italic
    context = yellow bold # context (ie: unchanged lines) text

以下是使用这些设置时 git diffn (带有行号的git diff)的示例输出。请注意,删除的行会显示为红色删除线文本。非常酷。我今天才知道这是可能的(虽然我不太喜欢这些颜色 - 我认为默认值最好 :))。

还请注意,左右两边的冒号没有着色或样式化以与周围文本匹配。这是一种故意设计的行为,旨在作为左侧添加的行号和右侧原始git diff输出之间的可视分隔符。

enter image description here


4
如果您想避免更改全局配置(即仅希望一次性更改颜色),则可以通过 -c 参数传递该参数,例如: git -c color.diff.new=cyan diff <file1> <file2> 将显示所有添加项的青色。 - Cole
1
漂亮、简单的方法,随时自定义终端颜色 - jasonleonhard
2
@jasonleonhard 是的,我也忘了对于复杂的指定符号,你只需要添加引号。例如,对于粗体青色:git -c color.diff.new="cyan bold" diff <file1> <file2> - Cole
@caot,你具体尝试了什么? - Gabriel Staples

1

强烈推荐:diff-so-fancy

"diff-so-fancy 致力于使您的差异可读性更高,而不是机器可读性。这有助于提高代码质量,并帮助您更快地发现缺陷。"


为什么?请添加一些优势的解释。 - Brian C
1
添加了他们网站提供的 blerp。可读性也不错,高对比度颜色。 - jasonleonhard

0

如果您正在Windows环境中尝试此操作,您可能会在"C:\Users\username\.gitconfig"找到全局的.gitconfig文件。

git config --global命令可以使用,但是如果您像我一样运行了多次,您的.gitconfig文件中将会出现重复的条目。这时您最好手动编辑它。


刚在 Mac 上测试了 git 2.30.1,无法重现“重复条目”的问题。 - TextGeek

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