如何复制git log --oneline --decorate的格式?

7

git log --oneline --decorate的格式定义在哪里?

我使用git log --format=format:'my format'命令,但是无法像git log --oneline --decorate命令中展示的那样呈现分支、标签和HEAD的颜色。

 git log --oneline --decorate    

将HEAD以浅蓝色显示,分支名称以绿色显示,标点符号(,,)以棕色显示。

我所能做到的最接近我的要求是:

git log --graph --abbrev-commit --decorate --date=short --format=format:'%C(bold blue)%h%C(reset) %C(bold green)%ad%C(reset)%d %C(white)%s%C(reset)' -20  

唯一的区别在于分支/HEAD/标签未像前一个命令一样着色。

3个回答

9

在git版本低于1.8.3时,似乎不可能实现。

自从git 1.8.3版本以后,可以使用颜色 %C(auto) 标记:

   git log --graph --decorate --date=short --format='%C(bold blue)%h%C %C(bold green)%ad %C(auto)%d  %C(white)%s%C(reset)' -10   

关键要素是:
%C(auto)%d ...  %C(reset) 

参见:

git log 中的颜色
Git pretty format 颜色


在某些情况下,您可能希望使用%D而不是%d,但%d与“--oneline --decorate”渲染匹配。另外请注意,%Creset也可以工作,但%Cauto无法工作,必须使用%C(auto)来获得漂亮的颜色。此外,您可能经常想要使用tformat而不是format - Mikko Rantalainen
@MikkoRantalainen,你对tformat的理解是正确的。有一种简写方式--format=xxx代替了--format=tformat:xxx,但我不确定它是在什么时候引入的。而且现有的回答向后兼容到1.8.3版本,所以我不太愿意去修改它。--abbrev-commit似乎是多余的,甚至可能在1.8.3版本中都是这样,因为%h已经表示了缩写形式。第三点是,在下一个%C…之前使用%C(reset)是多余的。即使按照现在的形式,这个答案也非常有帮助。 - kkm
@kkm 我已根据您的建议编辑了答案。谢谢。 - augustin

3

简而言之 - 我认为你不可能得到与git log --oneline提供的完全相同的格式,因为--format选项不允许任何条件语句,而git-log使用一个函数来生成每个提交信息的字符串。

最接近颜色的我得到了这个:

git log --format=format:'%C(auto)%h%C(reset) %C(auto)%s%C(reset)'

在我的计算机上看起来像这样:

terminal-screenshot


详细描述:

有关git-log的大多数文档可以在此处阅读:https://git-scm.com/docs/git-log

我深入代码(可在此处https://github.com/git/git获取源代码)以查看git对--oneline选项做了什么,下面是我发现的内容:

  • 跟踪始于revision.c,其中解析命令行选项

  • 然后,在pretty.c中解析该选项以匹配cmit_fmt枚举(定义在commit.h)的CMIT_FMT_ONELINE

  • 最后,在pretty.c中的pp_commit_easy执行实际打印。

  • 这就是变得棘手和复杂的地方。您可以在pretty.c的少数几个地方看到对CMIT_FMT_ONELINE的引用。我认为只有在指定--oneline选项时才会对每个提交执行pp_title_line。你可以看到在字符串缓冲区构建过程中进行了大量条件格式化。

所以,我认为没有办法通过标签和 (HEAD -> master) 元信息来复制实际格式。你可以编写一个Shell脚本来完成相同的操作,但其性能可能无法与git相匹配。


1
这应该现在(7年后)可以通过Git 2.43(2023年第四季度)实现,"git log --format"(man)已经学会了%(decorate)占位符。
查看 commit 1e63b34, commit f1f8a25, commit a58dd83, commit dcb347f, commit b87a9a2, commit a3883a6, commit 31a922f (2023年8月20日) 由 Andy Koppe (akoppecodek) 提交。
查看 commit 014aa1d (2023年8月20日) 由 Junio C Hamano (gitster) 提交。
(由 Junio C Hamano -- gitster -- 合并于 commit 86b56ff, 2023年9月14日)

pretty: 添加 %(decorate[:<options>]) 格式

签名:Andy Koppe

添加%(decorate[:<options>])格式,类似于%d格式,但允许自定义前缀、后缀和分隔符字符串。
省略的选项默认为%d中使用的字符串。
expand_separator()函数重命名为expand_string_arg(),因为它现在用于除分隔符之外的字符串。
示例: - %(decorate)等同于%d。 - %(decorate:prefix=,suffix=)等同于%D。 - %(decorate:prefix=[,suffix=],separator=%x3B)生成一个用方括号括起来并以分号分隔的列表。

pretty:为%(decorate)添加指针和标签选项

签名:Andy Koppe

%(decorate)格式添加指针和标签选项,以允许覆盖用于显示HEAD指向位置的" -> "字符串和标记标签的"tag: "字符串。

还有:

decorate:使用提交颜色作为HEAD箭头

签名:Andy Koppe

使用提交颜色而不是HEAD颜色来表示“HEAD -> branch”装饰中的箭头或自定义符号,以保持与前缀、分隔符和后缀符号的视觉一致性,这些符号也使用提交颜色进行着色。
这个改变是由于在%(decorate)选项中,有可能选择使用相同的符号作为指针和分隔符选项,如果是这样的话,它们应该是相同的颜色。
一个相关的先例是'ls -l',在符号链接中,箭头使用默认颜色而不是符号链接名称的颜色。
现在,pretty-formats在其手册页中包含了以下内容:
例如,要生成没有换行符或标签注释,并使用空格作为分隔符的装饰,可以使用以下格式: %(decorate:prefix=,suffix=,tag=,separator= )

pretty-formats 现在在其man page中包含了:

'%(decorate[:<options>])'

使用自定义装饰显示引用名称。
decorate 字符串后面可以跟着一个冒号和零个或多个逗号分隔的选项。
选项值可以包含字面格式化代码。这些代码必须用于逗号 (%x2C) 和右括号 (%x29),因为它们在选项语法中起到了作用。

  • 'prefix=<value>': 在引用名称列表之前显示。默认为 "{nbsp}("。
  • 'suffix=<value>': 在引用名称列表之后显示。默认为 ")"。
  • 'separator=<value>': 在引用名称之间显示。默认为 ",{nbsp}"。
  • 'pointer=<value>': 在 HEAD 和它所指向的分支之间显示,如果有的话。默认为 "{nbsp}->{nbsp}"。
  • 'tag=<value>': 在标签名称之前显示。默认为 "tag:{nbsp}"。

另请参阅提交 92741d8,仍然适用于 Git 2.43。 - undefined

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