有没有一种方法可以自定义 git blame 命令的输出?

60

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 的默认输出非常糟糕,我觉得肯定有人已经处理过了。

你们有什么想法吗?或者有没有实现这样一个脚本的提示?


3
您可以随时使用 git gui blame <file> :-)。(注:该命令通常用于查看某个文件中每一行代码最后一次被谁修改过。) - Jakub Narębski
11
我很确定它在SSH上不起作用。 - Rene Saarsoo
1
如果启用了X11转发,它至少可以在双方都使用X Window时工作...尽管我不建议这样做,因为它可能会很慢。 - Jakub Narębski
1
你应该在上面的编辑中推广你的“我的小链接”脚本链接,我花了一段时间才找到它。 - qneill
1
Git 2.18(2018年第二季度,8年后)为git blame添加了一些颜色配置选项:请参见下面我的更新答案 - VonC
8个回答

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

是的,“--date”选项有点帮助,但它仍然不如我想要的那么好。而且,我的看法是,annotate只会产生一种丑陋的输出 :P - Rene Saarsoo
@ReneSaarsoo:有针对责备/注释的GUI,其中之一是git gui blame - Jakub Narębski
这里有一个不错的脚本可用链接,可以添加漂亮的格式和颜色。 - Jorge Cabot
您还可以使用 --date=format:XXXXX 进行更灵活的日期格式化。 - wisbucky

13

更新 Git 2.18(2018年第二季度):"git blame" 学会了在与前一行相同的行上取消突出显示不感兴趣的元数据,并且根据提交的年龄以不同的颜色绘制行。

请参见 commit 0dc95a4commit 25d5f52commit cdc2d5f(由 Stefan Beller (stefanbeller) 于 2018 年 4 月 24 日提交)。
(由 Junio C Hamano -- gitster -- 合并于 commit 3d24129,2018 年 5 月 30 日)

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

添加一个配置选项,允许选择默认的blame颜色方案。命令行仍然优先于配置。

git config现在报告:

blame.coloring::
这决定了应用于指责输出的着色方案。它可以是“repeatedLines”,“highlightRecent”或默认值“none”。

内置/blame:突出显示最近更改的行

根据年龄选择不同的颜色并模拟“温度降低”。

与上一个补丁类似,此补丁提供了命令行选项'--color-by-age'以启用此模式,配置选项'color.blame.highlightrecent'以选择颜色。

文档现在添加:

color.blame.highlightRecent
这可以用于根据 blame 行的年龄来着色元数据。 此设置应设置为逗号分隔的颜色和日期设置列表,以颜色开头和结尾,日期应从旧到新设置。 如果该行是在给定时间戳之前引入的,则将基于颜色对元数据进行着色,覆盖较早时间戳的颜色。 相对时间戳也可以使用,例如 2 周前可用于处理任何比 2 周更旧的内容。 默认值为 'blue,12 month ago,white,1 month ago,red',将一年前之前的所有内容标记为蓝色,保留介于一个月和一年之间的最近更改为白色,并将在最后一个月内引入的行标记为红色。

builtin/blame: 减少无关元数据行

使用git-blame时,许多行包含冗余信息,例如在由多行组成的块中,元数据(提交名称、作者、日期)会被重复显示。
读者可能对这些不感兴趣,因此提供一种选项,可以将从上一行重复的信息以不同的颜色标记出来。
传统上,我们使用CYAN来表示不那么有趣的行(例如块标题),所以采用这种颜色。

命令行选项'--color-lines'将触发重复行的着色,而配置选项'color.blame.colorLines'可用于选择颜色。
设置配置选项并不意味着重复的行会被着色。


注意: "git blame" 的 "--color-lines" 和 "--color-by-age" 选项(man) 已经消失,现在已经在 Git 2.34 (2021年第四季度) 中记录文档。
请参见 commit 8c32856(2021年10月8日)和commit 38c356a(2021年10月1日),由Bagas Sanjaya (bagasme)提交。
(由Junio C Hamano -- gitster --合并于commit 871e42e,2021年10月18日)

blame: 文档 --color-* 选项

合著者:Dr. Matthias St. Pierre
签署者:Dr. Matthias St. Pierre
签署者:Bagas Sanjaya

提交 cdc2d5f(“builtin/blame: dim uninteresting metadata lines”,2018-04-23,Git v2.18.0-rc0 -- merge listed in batch #7)和 25d5f52(“builtin/blame: highlight recently changed lines”,2018-04-23,Git v2.18.0-rc0 -- merge listed in batch #7)向git blame(man)引入了--color-lines--color-by-age选项,分别。
虽然这两个选项在使用帮助中都有提到,但它们没有在git-blame(1)中记录。
请记录它们。

git blame现在在其man页面中包含以下内容:

[--color-lines] [--color-by-age] [--progress] [--abbrev=] [ | --contents | --reverse ..] [--]

blame-options现在在其man页面中包含以下内容:

--color-lines

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

--color-by-age

根据默认格式中行的年龄对行注释进行颜色标记。 color.blame.highlightRecent 配置选项控制每个年龄范围使用的颜色。

git config现在包含在其man页面中:

此设置应设置为逗号分隔的颜色和日期设置,以颜色开始和结束,日期应从最旧到最新设置。如果该行在给定时间戳之前引入,则元数据将以指定的颜色着色,覆盖较早的时间戳颜色。

git config现在包含在其man页面中:

默认值为blue,12个月前,白色,1个月前,红色,使一年前的所有内容变为蓝色,介于一个月到一年之间的最新更改保持为白色,而在最近一个月内引入的行则被着成红色。

git config现在包含在其man页面中:

使用指定的颜色为git blame --color-lines中的行注释着色,如果它们来自与前一行相同的提交,则使用该颜色。默认为青色。

原始答案 2010

考虑像Trac或Redmine这样的Web界面集成git blame结果,我想这样的解析已经完成了。

您可以在Redmine缺陷3832中看到一个使用此ruby脚本的示例:


gitweb还包括“blame”(和“blame_incremental”)视图,尽管默认情况下已关闭(因为它会占用CPU)。 - Jakub Narębski
阅读文档比阅读GitHub源代码更有趣(特别是当文本非常长且需要时间渲染时)。第一个链接是git-config,第二个链接是文档。我猜你所说的“21.8”应该是“2.18”?(我可以进行修复,但我想先知道你的想法。) - Franklin Yu
@Fra 是的,2.18。我已经相应地编辑了答案。 - VonC
@FranklinYu 我已经包含了你的链接(在我去年六月编辑Git 2.18答案时还没有出现)。 - VonC

12

VonC 的好答案 的基础上,我为 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周):

如果您对此有所改进,请在gist中进行评论! 如果您喜欢它,请点赞 ❤️


7

对我而言,-s选项可用,因为我只需要SHA1 ID,然后查找有关提交的详细信息。编写脚本肯定看起来过于繁琐。可能一年前-s选项还不可用吗?


1
使用了一年多,我可以说我的小脚本是花费的很值得的微小努力。对我来说,“-s”标志不够用——我非常关心作者和日期,如果可以避免深入挖掘,我就不想再去找。另外,我的脚本还能产生漂亮的彩色输出。 - Rene Saarsoo

4
你可以将以下代码添加到你的.gitconfig中,即可获得相对时间(如n天前):

[blame]
    date = human

3
这应该是 = 相对的 - nhooyr
有了这个highlightRecent功能,git blame确实变得更加用户友好了,谢谢! - Ulysse BN

4

由于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


0
如果您不需要显示时间,只需写入以下命令: git blame --date=format: [yourfilename.extension]
注意:在'format:'之后不要再写任何内容!

-1

git blame --porcelain 提供了你需要的信息,以一种脚本易于读取但对人类来说很难的形式呈现。这是编写脚本的好起点。


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