没有任何已知的怪异行为,最终解决方案在本答案底部。
解决方法是在格式字符串中放置一个自定义占位符来表示换行(而不使用%-b
魔法),然后使用sed
进行输出后处理。在下面的示例中,占位符是CHOMPABLENEWLINES
字符串(当然,您可以将其替换为任何您选择的文本,但确保它不会出现在您的提交消息中):
git log --format=format:"%C(yellow)%h %C(blue)%s %C(green)%ad %C(reset)%an%C(dim)CHOMPABLENEWLINES%b"|sed -e 's/CHOMPABLENEWLINES$//; s/CHOMPABLENEWLINES/\n\n/; $ s/$/\n/'
![使用sed后处理的git log带颜色输出](https://istack.dev59.com/ziFe5.webp)
请注意,这种方法还解决了一个问题,即%C
指令的效果仅延伸到当前行的末尾(至少在git 2.7.4中是这样)。因此,在多行正文的情况下,颜色仅应用于其第一行。比较如下:
# Only the first line of a multiline message body is colored
git log --format=format:"%C(yellow)%h %C(blue)%s %C(green)%ad %C(reset)%an%n%n%Cred%b"
![Colored output of git log without sed postprocessing](https://istack.dev59.com/KRWwa.webp)
# Entire multiline message body is colored (though a byproduct of this
# is that the color setting persists beyond the current
# command - note the red prompt following the output)
git log --format=format:"%C(yellow)%h %C(blue)%s %C(green)%ad %C(reset)%an%CredCHOMPABLENEWLINES%b"|sed -e 's/CHOMPABLENEWLINES$//; s/CHOMPABLENEWLINES/\n\n/; $ s/$/\n/'
![使用sed后处理的git log彩色输出](https://istack.dev59.com/i8xYl.webp)
如果持续颜色设置产生不良的副作用,可以通过在格式字符串结尾添加%C(reset)
指令来抵消这种影响。然后我们还需要一个自定义标记来结束%b
占位符,因为从sed
的角度来看,视觉上的行末不再是实际的行末了。在下面的示例中,字符串ENDOFBODY
被用作这样的标记(当然你必须选择它,以使其不出现在你预期的输出中)。
# This version works with GNU sed. For a portable version (including BSD
# and MacOS X systems) scroll down a little more
git log --format=tformat:"%C(yellow)%h %C(blue)%s %C(green)%ad %C(reset)%an%CredCHOMPABLENEWLINES%bENDOFBODY%C(reset)"|sed -e 's/CHOMPABLENEWLINESENDOFBODY//; s/CHOMPABLENEWLINES/\n\n/; s/ENDOFBODY//'
![最终版本的输出](https://istack.dev59.com/a9gJD.webp)
有些版本或设置的git会在输出不直接传输到终端时禁用彩色输出。在这种情况下,您还必须为git log
提供--color=always
选项。
最终解决方案只使用sed的可移植特性,如下所示:
git log --color=always --format=tformat:"%C(yellow)%h %C(blue)%s %C(green)%ad %C(reset)%an%C(red)CHOMPABLENEWLINES%bENDOFBODY%C(reset)"|sed -e 's/CHOMPABLENEWLINESENDOFBODY//; s/CHOMPABLENEWLINES/\'$'\n''\'$'\n/; s/ENDOFBODY//'
--format=tformat:
类似于--format=format:
,但它在输出的最后一行后添加了一个换行符,这有助于稍微缩短sed脚本。 - Leon--color=always
可以恢复颜色!还有一个问题我无法解决;换行符打印为字面上的n
。我尝试了双重转义,但在这种情况下它们打印为字面上的\n
... :S - stkentn
这就是我在承诺提供 macOS 正确的 sed 命令时所想到的。我更新了答案,提供了一个可移植版本,在 Linux 和 BSD 系统(包括 macOS)下完全相同。 - Leon