Git: 格式化为正确自动着色 %d

Git: format to correctly autocolor %d

我阅读 git-log manpage 的方式:

%C(…​): color specification, as described in color.branch.* config option; adding auto, at the beginning will emit color only when colors are enabled for log output (by color.diff, color.ui, or --color, and respecting the auto settings of the former if we are going to a terminal). auto alone (i.e. %C(auto)) will turn on auto coloring on the next placeholders until the color is switched again.

那么以下两种格式之一应该是有条件地请求颜色的正确方法(就像您需要在脚本、别名或命名漂亮格式中做的那样) %d%D:

--pretty='%C(auto)%d'
--pretty='%C(auto,auto)%d'

然而,第一种格式(%C(auto)%d)似乎不起作用,用这三个命令进行测试——首先,在没有分页器的情况下生成彩色输出;其次,尝试通过管道传输到 cat 来调用自动颜色抑制;最后,显式抑制颜色(注意,您需要检查一个分支 and/or 标记以查看颜色效果,否则 %d 不输出任何内容):

git --no-pager log -5 --pretty='%C(auto)%d %C(auto,blue)%s'
# correctly shows %d dynamically colored and %s blue

git --no-pager log -5 --pretty='%C(auto)%d %C(auto,blue)%s' | cat
# still colored %d, but %s uncolored

git --no-pager log --color=never -5 --pretty='%C(auto) %d %C(auto,blue)%s'
# same: still colored %d, but %s uncolored

尝试第二种格式(%C(auto,auto)%d)也不行:

git --no-pager log -5 --pretty='%C(auto,auto) %d %C(auto,blue)%s'
error: invalid color value: auto
fatal: unable to parse --pretty format

git --no-pager log -5 --pretty='%C(auto,auto) %d %C(auto,blue)%s' | cat
# correct, no colors

git --no-pager log --color=never -5 --pretty='%C(auto,auto) %d %C(auto,blue)%s'
# correct, no colors

我不确定我做错了什么。当且仅当输出通常是彩色的时,打印彩色 %d%D 的正确格式顺序是什么?

您的第一种格式在 colourised/non-colourised 输出方面符合预期(至少对于 v2.11.0)。

TL;DR

然而你错过了重新设置颜色规范,如果在下一个项目的开头(如果没有设置颜色)会导致错误的颜色。

更正的颜色规格:

%h %C(auto)%d %C(auto,blue)%s%C(auto,reset)

测试:

git config pretty.test "%h %C(auto)%d %C(auto,blue)%s%C(auto,reset)"

echo; git --no-pager log -5 --pretty=test
echo; git --no-pager log -5 --pretty=test | cat
echo; git --no-pager log -5 --pretty=test --color=never