Git漂亮格式的颜色

104

我正在尝试为Git设置漂亮的格式颜色。据我所知,版本1.6.0只能识别红、绿和蓝三种颜色。

$ git log --pretty=format:"%Credred%Creset %Cgreengreen%Creset %Cyellowyellow%Creset %Cblueblue%Creset %Cmagentamagenta%Creset %Ccyancyan%Creset %Cwhitewhite%Creset"
red green %Cyellowyellow%Creset blue %Cmagentamagenta %Ccyancyan %Cwhitewhite

此外,没有一种颜色与括号格式的颜色配合使用。

有办法列出 Git 可用的漂亮格式颜色吗?

不幸的是,这是在遗留的 SCO OpenServer 5.0.7 机器上,SCO Skunkworks 发布的最后一个 Git 版本是1.6.0.3。


1
如果你的平台已经过时,为什么不从git-scm.com下载最新的git 1.8.x并自行编译呢?这样它就可以支持所有最新的功能了。 - mvp
@mvp 好的,如你所说,该平台已经过时 - 意味着缺乏GNU构建环境。我正在准备现有应用程序源代码以迁移到Linux。 - James Allman
1
请注意,Git 2.3.0(2015年2月)将允许使用24位颜色值,并更好地管理颜色属性(粗体,下划线等)。请参见下面的我的答案 - VonC
Git 2.26(2020年第一季度)将添加属性“bright”以支持明亮的aixterm颜色。请参见下面我的编辑答案:https://dev59.com/tWUp5IYBdhLWcg3wLVOn#28256977 - VonC
5个回答

173

我没有旧版本的git来验证是否支持除redbluegreen之外的颜色。

不过,我注意到即使是最近的git版本(比如我使用的1.7.10),除redgreenblue之外的颜色也需要用括号()括起来。对于redgreenblue,括号是可选的。

所以试试这个:

git log --pretty=format:"%Credred%Creset %Cgreengreen%Creset %C(Yellow)yellow%Creset %Cblueblue%Creset %C(magenta)magenta%Creset %C(cyan)cyan%Creset %C(white)white%Creset"

我所知道的颜色列表至少有:
normal
black
red
green
yellow
blue
magenta
cyan
white

可以与以下一个或多个属性结合使用:
bold
dim
ul
blink
reverse
italic
strike
bright  # (Git 2.26, Q1 2020, example: brightred)

如果你想要通过 .gitconfig 文件来改变颜色,你应该能够指定两种颜色 - 前景色和背景色,并且可以与属性结合使用。

我相信你是对的,只支持基本颜色。在这个版本(1.6.0.3)中,括号格式的颜色根本不起作用。 - James Allman
21
空格分隔前景色、背景色和属性,格式为 %C(红 绿 加粗)。 - HexInteractive
至少还有另外两个属性:italicstrike,在此手册中写得很清楚 https://git-scm.com/docs/git-config ,为了完整起见。 - onemorequestion
1
@onemorequestion 没问题。我已经相应地编辑了答案。顺便说一下,我真的很喜欢你的另一个答案(https://dev59.com/gXNA5IYBdhLWcg3wL6yx#61487052)。 - VonC
奇怪的是,brightred可以正常工作,但dimmagenta无法正常工作(Git 2.36)。 - Dai

51

Git 2.3.0(2015年2月)将允许(感谢Jeff Kink (peff)):


parse_color:支持24位RGB值

Some terminals (like XTerm) allow full 24-bit RGB color specifications using an extension to the regular ANSI color scheme.
Let's allow users to specify hex RGB colors, enabling the all-important feature of hot pink ref decorations:

git log --format="%h%C(#ff69b4)%d%C(reset) %s"

  • 更好的颜色属性管理:

parse_color:识别“no$foo”以清除$ foo属性

You can turn on ANSI text attributes like "reverse" by putting "reverse" in your color spec. However, you cannot ask to turn reverse off.

For common cases, this does not matter. You would turn on "reverse" at the start of a colored section, and then clear all attributes with a "reset".

However, you may wish to turn on some attributes, then selectively disable others. For example:

git log --format="%C(bold ul yellow)%h%C(noul) %s"

underlines just the hash, but without the need to re-specify the rest of the attributes.

This can also help third-party programs, like contrib/diff-highlight, that want to turn some attribute on/off without disrupting existing coloring.

Note that some attribute specifications are probably nonsensical (e.g., "bold nobold"). We do not bother to flag such constructs, and instead let the terminal sort it out.


在Git 2.26(2020年第一季度),基本的七种颜色学会了更明亮的对应颜色(例如“brightred”)。

查看 commit c444f03, commit 1751b09, commit 4a28eb0 (2020年1月21日) 由 Eyal Soha (``) 提交。
(合并于 commit 87f17d7,2020年2月25日,由 Junio C Hamano -- gitster -- 审核)

color.c:支持亮色的aixterm颜色

签名作者:Eyal Soha

这些颜色是3比特颜色的亮色变种。前景颜色的范围不再是30-37,而是90-97,而背景颜色的范围则是100-107,而不是40-47。 git config文档现在包括:
基本颜色包括normalblackredgreenyellowbluemagentacyanwhite
给定的第一个颜色是前景色,第二个是背景色。

除了normal以外的所有基本颜色都有一个亮色变体,可以在颜色前加上bright来指定,例如brightred


在 Git 2.35 (2022 年第一季度) 中,我们的调色板中添加了“default”和“reset”颜色。

请查看commit de65851(2021年10月26日),以及commit 05f1f41commit aeefc18(2021年10月25日)由Robert Estelle (rwe)提交。
(由Junio C Hamano -- gitster --合并在commit 15209c8中,2021年12月15日)

color: 允许颜色以“reset”为前缀

署名:Robert Estelle

之前,“reset”被视为一个独立的特殊颜色名称,代表 \e[m
现在,它可以应用于其他颜色属性,允许精确的规格说明而无需隐式属性继承。

例如,“reset green”现在呈现为 \e[;32m,被解释为“重置所有内容;然后将前景设置为绿色”。
这意味着背景和其他属性也被重置为它们的默认值。

以前,这在单个颜色中是不可能表示的:“reset”可以单独指定,或者带有属性的颜色,但是像清除背景颜色这样的事情是不可能的。

有一个单独的更改引入了“default”颜色名称来辅助处理,但即使如此,上述内容也只能通过显式禁用每个属性来表示:

green default no-bold no-dim no-italic no-ul no-blink no-reverse no-strike

config现在在其手册页面中包括:

伪属性reset在应用指定的着色之前重置所有颜色和属性。例如,reset green将导致绿色前景和默认背景,没有任何活动属性。


请参见https://dev59.com/KGcs5IYBdhLWcg3wgkMQ#12798205:git 2.9.1支持两个新属性:斜体和删除线。 - VonC
2
你知道如何在git别名中包含RGB颜色吗?#ff69b4在命令行上可以工作,但在别名中不行,因为#会开始一个注释。 - Tim Malone
@TimMalone 我还没有测试过,但是配置手册上说:“在名称 = 后面的前导空格、第一个注释字符 #; 后面的行剩余部分以及行尾的尾随空格都会被丢弃,除非它们被双引号包含。” - VonC
1
@TimMalone 把整个别名放在 " 引号中,那么 # 就不会是特殊字符了。 - Tom Hale
@VonC,当我将 git log 命令输出重定向到文本或剪贴板时,我得到了奇怪的字符。看起来这是在使用 --format 时出现颜色和属性的情况。你有任何想法或解决方法吗? - hIpPy
@hIpPy 目前还没有头绪:您能否在一个新的问题中详细说明您的问题(包括使用的操作系统、Git版本和shell)? - VonC

10

分享我的git日志格式:

$ git log --graph --pretty=format:'%C(magenta)%h%Creset -%C(red)%d%Creset %s %C(dim green)(%cr) %C(cyan)<%an>%Creset' --abbrev-commit

您也可以将别名添加到~/.gitconfig中:
[alias]
    logs  = log --graph --pretty=format:'%C(magenta)%h%Creset -%C(red)%d%Creset %s %C(dim green)(%cr) %C(cyan)<%an>%Creset' --abbrev-commit

然后你可以使用在~/.gitconfig中定义的别名。

$ git logs

9
这个问题询问如何找到 Git 的漂亮格式颜色。 - Rapnar

6
这里是我写的两个别名,一旦我理解了使用自定义十六进制颜色值的语法,就像VonC的答案所示。
有四个版本。唯一的区别是--graph指令,而f版本还将向您显示已添加、删除或修改的文件。
[alias]
    lg = log --graph --pretty=format:"%C(#cd9a00)%h\\%C(#0080ff)\\ <%an>\\ %C(#17b062)(%cr)\\ %d\\%C(#c0d6de)%s"    
    l1 = log         --pretty=format:"%C(#cd9a00)%h\\%C(#0080ff)\\ <%an>\\ %C(#17b062)(%cr)\\ %d\\%C(#c0d6de)%s"    
    lgf = log --name-status --graph --pretty=format:"%C(#cd9a00)%h\\%C(#0080ff)\\ <%an>\\ %C(#17b062)(%cr)\\ %d\\%C(#c0d6de)%s" 
    l1f = log --name-status         --pretty=format:"%C(#cd9a00)%h\\%C(#0080ff)\\ <%an>\\ %C(#17b062)(%cr)\\ %d\\%C(#c0d6de)%s"

我使用 ColorHexa 来选择我想要的准确颜色,然后从中复制十六进制值。
对于Windows,请打开位于C:\Users\YourUserName文件夹中的.gitconfig文件,并按上面所示添加一个别名部分。

4

我正在使用Ubuntu 18.04,我能够使用Xiaofei HAN的建议。

对于初学者来说,我最好的运气是编辑.gitconfig文件。

nano ~/.gitconfig

将上方的[alias]块复制粘贴到现有文本下面
CTRL + O(写入)+ CTRL + X(关闭nano)
这样做后,为了查看漂亮的颜色,您可以使用
git logs

使用 'git log' 命令可以查看没有颜色的视图,

'git logs --oneline' 也是一样,只不过会在侧边显示花纹。

谢谢,希望这能帮到某些人。


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