在git-log中如何展示颜色

116
当你运行git log --decorate --pretty=oneline时,输出会有类似于(HEAD, refs/published/master, master)的条目并带有颜色。
我在我的gitconfig中也有以下内容:
[color "branch"]
    current = yellow reverse
    local = yellow
    remote = green

当使用以下自定义格式时,如何复制这些颜色?

git log --decorate --stat --graph --pretty=format:"%d %Cgreen%h%Creset (%ar - %Cred%an%Creset), %s%n"
5个回答

101

自 git 1.8.3(2013年5月24日)起,您可以在 git log 的格式化字符串中使用 %C(auto) 来修饰 %d

发布说明中得知:

 * "git log --format" specifier learned %C(auto) token that tells Git
   to use color when interpolating %d (decoration), %h (short commit
   object name), etc. for terminal output.)

64

git log --decorate 默认会显示:

  • HEAD 以青色显示
  • 远程分支以红色显示
  • 标签以绿色显示

可以通过color.decorate 配置更改颜色。

但是 git log --format 没有特定的方式来显示 HEAD 或 远程分支 或 分支:所有三个都通过 %d 显示,只能使用一种颜色。


2013年5月更新,如下面所述Elad Shahar(赞同),git 1.8.3提供了一个更多的选项:

git log –format现在支持一个%C(auto)标记,告诉Git在终端输出时使用颜色来解决%d(装饰)、%h(短提交对象名称)等。

这篇Atlassian博客文章评论说,这个功能是几个其他功能的一部分,主要集中在格式(git rebasegit count-objects)和颜色(git branch -vv)上。

这是在之前1.8.2的auto,reset的基础上增加的,当输出不用于终端时自动禁用颜色。

%C(auto,blue)Hello%C(auto,reset)

注意:git 2.4+(2015年第二季度)将更好地重置分支名称周围的颜色。
请参见Junio C Hamano( gitster )提交commit 5ee8758

log --decorate:不要将“提交”颜色泄漏到下一个项目中

在“git log --decorate”中,您会看到像这样的提交标题:

commit ... (HEAD, jc/decorate-leaky-separator-color)

在这里,"commit ... (" 是以 color.diff.commit 的颜色绘制的,"HEAD" 是以 color.decorate.head 的颜色绘制的,", " 是以 color.diff.commit 的颜色绘制的,分支名是以 color.decorate.branch 的颜色绘制的,然后在 color.diff.commit 中关闭 ")"。如果您想要将 HEAD 和本地分支名称涂成与正文相同的颜色(可能因为青色和绿色在黑白终端上过于微弱而无法阅读),您就不希望说出来。
[color "decorate"]
    head = black
    branch = black

因为你无法在白底黑字的终端上重复使用相同的配置。你可能天真地期望{{...}}。
[color "decorate"]
    head = normal
branch = normal

很遗憾,它不能正常工作。
它将字符串 "HEAD" 和分支名称以及装饰元素之间的左括号或逗号涂成相同的颜色。
这是因为代码在以自己的颜色打印 "prefix" 后忘记重置颜色。
请注意,git 2.5 (Q2 2015) 修复了一个错误:
请参见commit 429ad20,由Junio C Hamano (gitster)于2015年5月13日提交。
(由Junio C Hamano -- gitster --合并到commit fd70780,2015年5月22日)

log: 不要过早缩短装饰名称

Git 2.4 中 "log --decorate" 的增强功能会显示当前分支头部的提交,例如 "HEAD -> master",但无法与 --decorate=full 一起使用。


Git 2.9.x+(2016年第三季度)将修复另一个错误,并且尊重color=auto用于%C(auto)


Git 2.10.2(2016年10月)修复了commit 82b83da(2016年9月29日)和commit c99ad27(2016年9月17日)的其他错误,由René Scharfe(“”)修复。
(由Junio C Hamano -- gitster --合并于commit 76796d4,2016年10月28日)

pretty: 如果输出为空,则避免为%C(auto)添加重置

我们会发出一个用于重置颜色和属性的转义序列,以确保自动着色按预期显示。
如果输出的strbuf为空,则停止这样做,即当%C(auto)出现在格式字符串的开头时,因为此时不需要重置,我们可以在输出中节省一些字节。

pretty: 让%C(auto)重置所有属性

%C(auto)上重置颜色和属性,以实现对它们的完全自动控制;否则,像粗体或反向等属性可能仍然受到先前%C占位符的影响。


3
是否没有办法同时使用 "--decorate" 和 "--pretty='...stuff'" 参数? - NorthIsUp
8
--decorate 命令似乎有自己的实现和配置,而 --pretty 命令通过 %d 提供相同的信息作为一个块,这意味着你不能像使用 --decorate 命令一样对 --pretty 命令进行同样精细的颜色配置。 - VonC
@JWoodchuck 尝试使用git config --show-origin -l命令:您将看到所有配置。然后,您可以使用"color"命令进行grep。 - VonC
@JWoodchuck 可能是因为 Git 1.8.4 中 color.ui 被设置为 true 或 auto:https://git-scm.com/docs/git-config#git-config-colorui - VonC
听起来很合理,考虑到这是很久以前的事情了,而我现在用的是2.16.2版本。谢谢! - Woodchuck
显示剩余2条评论

10

将它们括起来:

%C(...):颜色规范,如color.branch.*配置选项所述

所以%C(yellow reverse)就可以了。


1
不太对,%d 包含所有分支,因此它可能看起来像 (HEAD, master),在这种情况下,head 应该是蓝色的,master 应该是绿色的(我相信这些是默认颜色)。而 %C(yellow)%d%Creset 则会使其全部变成黄色。 - NorthIsUp
2
哦,给单个装饰物上色。我觉得这是不可能的。渲染日志条目的代码实际上是两次实现。 - Josh Lee
1
很遗憾这是不可能的... 我很想执行 git log --decorate --oneline --date=... - mgalgs

8

配置选项log.decorate可以启用/禁用日志中的默认装饰。

git config --global log.decorate full

完成这些步骤后,您可以使用color.decorate.*来玩转颜色。


3
log.decorate=full 会打印出带有前缀(例如 refs/heads/ 等)的引用名称;我认为 log.decorate=short 更加有用。 - musiphil
1
非常有用的设置,尽管我更喜欢“短”而不是“完整”。 - Thomas Levesque

5

有些人想使用这个:%C(颜色名称),这不需要改变颜色配置。

例如:将作者名称着色为黄色。

--pretty=format:"%C(yellow)%an%Creset"

正常的ANSI颜色应该可以工作。可参考https://en.wikipedia.org/wiki/ANSI_escape_code
  • 黑色
  • 红色
  • 绿色
  • 黄色
  • 蓝色
  • 洋红色
  • 青色
  • 白色

我们可以使用其他颜色,比如灰色吗? - alper

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