有没有办法自定义git blame的输出?

m4pnthwp  于 2023-08-01  发布在  Git
关注(0)|答案(8)|浏览(112)

git log有一个很好的--format选项来指定输出应该如何格式化。
但是git blame似乎没有等效的输出,尽管blame的默认输出并不十分人性化。我希望看到更少。
例如,而不是:

5600cab7 js/sidebar/VehicleGrid.js        (Rene Saarsoo    2009-10-08 18:55:24 +0000 127)    if (x > y) {
b5f1040c js/map/monitoring/VehicleGrid.js (Mihkel Muhkel   2010-05-31 07:20:13 +0000 128)        return x;

字符串
我想拥有:

5600cab7 Rene Saarsoo (1 year ago)     127:    if (x > y) {
b5f1040c Mihkel Muhkel (5 months ago)  128:        return x;


我想我可以写一个脚本来解析git blame --porcelain的输出,但是考虑到blame可怕的默认输出,我觉得一定有人已经做了一些事情。
有什么想法吗?或者实现这样一个脚本的任何提示?

r6hnlfcb

r6hnlfcb1#

您可以使用备用输出格式:git annotategit blame -c
您可以使用--date=<format>选项(或blame.date配置变量)更改日期格式,其中<format>relative,local,default,iso,rfc,short 之一。有关详细信息,请参见git-blamegit-log手册页。

h43kikqp

h43kikqp2#

更新Git 2.18(2018年第2季度):“git blame“学习在与前一个相同的行上取消突出显示来自原始提交的不感兴趣的元数据,并且还根据提交的时间以不同的颜色绘制行。
参见commit 0dc95a4commit 25d5f52commit cdc2d5f(2018年4月24日)by Stefan Beller ( stefanbeller )
(由Junio C Hamano -- gitster --合并至commit 3d24129,2018年5月30日)

builtin/blame:添加新的配色方案配置

添加一个配置选项,允许选择默认的颜色方案的责任。命令行仍然优先于配置。
git config现在报告:

blame.coloring::

字符串
这确定了要应用于责任输出的着色方案。
它可以是'repeatedLines'、'highlightRecent'或'none'(默认值)。

builtin/blame:突出显示最近更改行

选择不同的颜色的日期和模仿'温度降温'根据年龄。
与上一个补丁类似,它提供了命令行选项“--color-by-age”来启用此模式,并提供了配置选项“color.blame.highlightrecent”来选择颜色。
文档现在增加了:

color.blame.highlightRecent


这可以用于根据线的年龄对责任线的元数据着色。
此设置应设置为逗号分隔的颜色和日期设置列表,以颜色开始和结束,日期应按从最旧到最新的顺序设置。
如果行在给定时间戳之前引入,则元数据将被着色给定颜色,从而覆盖较旧的时间戳颜色。
代替绝对时间戳,相对时间戳也起作用,例如。2.weeks.ago适用于2周以上的任何内容。
它的默认值为'blue,12 month ago,white,1 month ago,red',这将所有超过一年的内容都涂成蓝色,一个月到一年之间的最近更改保持白色,而上个月引入的行则涂成红色。

builtin/blame:模糊不感兴趣的元数据行

当使用git-blame时,许多行包含冗余信息,例如在由多行组成的块中,元数据(提交名称,作者,日期)是重复的。
读者可能对这些不感兴趣,所以提供一个选项,以不同的颜色从上一行重复的信息。
传统上,我们使用CYAN来表示比其他线条更不有趣的线条(例如大块头头),所以去吧。
命令行选项'--color-lines'将触发重复行的着色,并提供配置选项'color.blame.colorLines'来选择颜色。
设置config选项并不意味着重复的行是彩色的。
注意:“git blame”(man)的“--color-lines”和“--color-by-age”选项已丢失,现在随Git 2.34(Q4 2021)一起记录。
参见commit 8c32856(2021年10月8日)和commit 38c356a(2021年10月1日),作者Bagas Sanjaya ( bagasme )
(由Junio C Hamano -- gitster --合并于commit 871e42e,2021年10月18日)

blame:document --color-* 选项

共同撰写人:Matthias St.皮埃尔
签收人:Matthias St.皮埃尔
签收人:巴加斯·桑贾亚
提交cdc2d5f(“builtin/blame:dim uninteresting metadata lines”,2018-04-23,Git v2.18.0-rc0 -- merge listed in batch #7)and 25d5f52(“builtin/blame:高亮显示最近更改的行”,2018-04-23,Git v2.18.0-rc 0--merge listed in batch #7)分别为git blameman)引入了--color-lines--color-by-age选项。
虽然这两个选项都在使用帮助中提到,但在git-blame(1)中没有记录。
记录他们。
git blame现在在其手册页中包括:
[--color-lines] [--color-by-age] [--progress] [--v =] [|--内容|--reverse ..] [--]
blame-options现在在其手册页中包括:

--color-lines

如果行注解来自与前一行相同的提交,则以不同的默认格式为行注解着色。这使得区分由不同提交引入的代码块变得更容易。颜色默认为青色,可以使用color.blame.repeatedLines配置选项进行调整。

--color-by-age

根据默认格式中线条的存在时间为线条注解着色。color.blame.highlightRecent配置选项控制每个年龄范围使用的颜色。
git config现在在其手册页中包括:
此设置应设置为逗号分隔的颜色和日期设置列表,以颜色开始和结束,日期应按从最旧到最新的顺序设置。如果行是在给定的时间戳之前引入的,则元数据将使用指定的颜色着色,从而覆盖较早的时间戳颜色。
git config现在在其手册页中包括:
它的默认值为blue,12 month ago,white,1 month ago,red,它将一年以上的所有内容都涂成蓝色,一个月到一年之间的最近更改保持为白色,上个月引入的行则涂成红色。
git config现在在其手册页中包括:
如果git blame --color-lines的行注解来自与前一行相同的提交,请使用指定的颜色对行注解着色。默认为青色。
原创2010
考虑到像Trac或Redmine这样的Web接口集成了git blame结果,我想这样的解析已经完成了。
你可以在这个Redmine Defect 3832中看到一个使用ruby脚本的例子:

*git_adapter.rb

vngu2lb8

vngu2lb83#

VonC's great answer的基础上,我为color.blame.highlightRecent配置做了一个更完整的扩展:

[color "blame"]
    highlightRecent = 237, 20 month ago, 238, 19 month ago, 239, 18 month ago, 240, 17 month ago, 241, 16 month ago, 242, 15 month ago, 243, 14 month ago, 244, 13 month ago, 245, 12 month ago, 246, 11 month ago, 247, 10 month ago, 248, 9 month ago, 249, 8 month ago, 250, 7 month ago, 251, 6 month ago, 252, 5 month ago, 253, 4 month ago, 254, 3 month ago, 231, 2 month ago, 230, 1 month ago, 229, 3 weeks ago, 228, 2 weeks ago, 227, 1 week ago, 226

字符串
它有一个从20个月前到现在的量表(过去4周,颜色不同):
x1c 0d1x的数据
如果你改进了,评论the gist!星星如果你喜欢它️

tpxzln5u

tpxzln5u4#

对我来说,-s标志是有效的,因为我只需要SHA1 ID,然后我会查找提交的细节。一个剧本绝对看起来像是矫枉过正。有没有可能-s标志一年前就没有了?

js81xvg6

js81xvg65#

您可以将其添加到.gitconfig中以获取相对时间(n天前等)

[blame]
    date = human

字符串

o8x7eapl

o8x7eapl6#

由于git log为输出提供了更多的自定义选项,因此您可以合并git blameawkxargsgit log来实现您想要的功能。例如:

git --no-pager blame <filepath> -L1,+1 --porcelain | awk 'NR==1 {print $1}' | xargs git --no-pager log -1 --pretty=format:"%h - (%cd) %s - %an" --date=relative

字符串
输出如下所示:

f8a66e80c - (5 months ago) Add gem: devise - elquimista


基本上,git blameawk在上面所做的是获得一个完整的提交SHA,xargs将其作为参数传递给git log

mv1qrgav

mv1qrgav7#

如果你不需要时间来显示,你可以写jus:git blame --date=format:[yourfilename.extension]
注意:你不应该在'format:'后面写任何东西!

ymzxtsji

ymzxtsji8#

git blame --porcelain以脚本易于阅读的形式提供所需的信息,但对人类来说很难。这将是一个很好的地方开始写剧本。

相关问题