59

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我觉得肯定有人已经对此做了一些事情。

有任何想法吗?或者实现这样一个脚本的任何提示?

4

7 回答 7

20

您可以使用备用输出格式:git annotategit blame -c.

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

于 2010-10-18T14:27:10.180 回答
13

更新 Git 2.18(2018 年第二季度):“ git blame”学会在与前一个相同的行上从原始提交中取消突出显示无趣的元数据,并根据提交的时间用不同的颜色绘制线。

请参阅Stefan Beller ( )的提交 0dc95a4提交 25d5f52提交 cdc2d5f(2018 年 4 月 24 日) 。(由Junio C Hamano 合并 -- --提交 3d24129中,2018 年 5 月 30 日)stefanbeller
gitster

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

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

git config现在报告:

blame.coloring::

这决定了要应用于责备输出的着色方案。
它可以是 ' repeatedLines'、' highlightRecent' 或 ' none',这是默认值。


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

为日期选择不同的颜色,并根据年龄模仿“降温”。

与上一个补丁类似,它提供了命令行选项“ --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提供配置选项“ ”来选择颜色。
设置配置选项并不意味着重复的行是彩色的。


注意: “ ” man--color-lines的“ ”和“ --color-by-age”选项已丢失,现在在 Git 2.34(2021 年第四季度)中记录了这些选项。git blame

请参阅Bagas Sanjaya ( ) 的提交8c32856 (2021年 10 月 8 日)和提交 38c356a(2021 年 10 月 1 日(由Junio C Hamano 合并 -- --871e42e 提交中,2021 年 10 月 18 日)bagasme
gitster

blame: 文档 --color-* 选项

合着:Matthias St. Pierre
博士 署名:Matthias St. Pierre 博士
署名:Bagas Sanjaya

提交cdc2d5f (" builtin/blame: dim uninteresting metadata lines", 2018-04-23, Git v2.18.0-rc0 --合并在批次 #7中列出) 和25d5f52 (" builtin/blame: highlight 最近更改的行", 2018-04-23, Git v2.18.0-rc0 -批次 #7中列出的合并)分别介绍和选项到( man )。 虽然在使用帮助中提到了这两个选项,但它们没有记录在. 记录它们。--color-lines--color-by-agegit blame
git-blame(1)

git blame现在在其手册页中包含:

[--color-lines] [--color-by-age] [--progress] [--abbrev=] [ | --内容 | - 撤销 ..] [ - ]

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​​ 脚本的示例:

于 2010-10-18T13:03:17.733 回答
8

进一步了解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 周,颜色不同):

如果您改进了它,请评论要点!喜欢就加星吧❤️

于 2021-02-17T21:55:00.863 回答
7

对我来说,-s 标志有效,因为我只需要 SHA1 ID,然后我会查找提交以获取详细信息。脚本绝对看起来有点矫枉过正。-s 标志是否可能在一年前不可用?

于 2012-01-12T00:46:40.663 回答
1

由于git log为输出提供了更多的自定义选项,您可以组合、 和git blameawk实现您想要的。例如xargsgit 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作为参数传递给它。

于 2018-10-31T02:09:56.633 回答
1

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

[blame]
    date = human
于 2020-05-10T16:54:22.397 回答
0

git blame --porcelain以脚本易于阅读但人类难以阅读的形式提供所需的信息。这将是开始编写脚本的好地方。

于 2021-12-23T11:17:59.313 回答