【问题标题】:Is there a way to customize the output of git blame?有没有办法自定义 git blame 的输出?
【发布时间】:2011-04-26 21:59:51
【问题描述】:

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 的可怕默认输出,我觉得肯定有人已经做了一些事情。

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

【问题讨论】:

  • 你可以随时使用git gui blame <file> :-)
  • 好吧,我很确定它不能通过 SSH 工作。
  • 如果您启用 X11 转发,它会起作用(至少在双方都使用 X Window 时)...虽然我不推荐它,因为它可能很慢。
  • 你应该将你的“我的小链接”脚本链接推广到上面的编辑中,我花了一段时间才找到它。
  • Git 2.18(2018 年第二季度,8 年后)为 git blame 添加了一些颜色配置选项:请参阅 my updated answer below

标签: git blame


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    Stefan Beller (stefanbeller) 参见 commit 0dc95a4commit 25d5f52commit cdc2d5f(2018 年 4 月 24 日)。
    (由 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' 选择颜色。

    The documentation 现在添加:

    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'是 提供以选择颜色。
    设置配置选项并不意味着重复的行是彩色的。


    注意:“git blame(man) 的“--color-lines”和“--color-by-age”选项已丢失,现已在 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: 暗淡无趣的元数据行", 2018-04-23, Git v2.18.0-rc0 -- merge 列在batch #7) 和25d5f52 ("@987654378 @:突出显示最近更改的行”,2018-04-23,Git v2.18.0-rc0 -- merge 列在 batch #7) 中将 --color-lines--color-by-age 选项引入 git blame(@987654344 @)
    虽然在使用帮助中提到了这两个选项,但git-blame(1) 中没有记录它们。
    记录它们。

    git blame 现在包含在其man page 中:

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

    blame-options 现在包含在其man page 中:

    --color-lines

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

    --color-by-age

    根据默认格式的线条年龄对线条注释进行着色。 color.blame.highlightRecent 配置选项控制使用什么颜色 每个年龄段。

    git config 现在包含在其man page 中:

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

    git config 现在包含在其man page 中:

    默认为blue,12 month ago,white,1 month ago,red,即 将一年以上的所有东西都涂成蓝色,最近的变化 一岁一岁保持白色,并引入线条 上个月内为红色。

    git config 现在包含在其man page 中:

    使用指定的颜色为线条注释着色 git blame --color-lines,如果它们来自与 前一行。默认为青色。


    2010 年原始答案

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

    您可以在 Redmine Defect 3832 中看到这个 ruby​​ 脚本的示例:

    【讨论】:

    • 谢谢,这个来源确实有帮助。
    • gitweb 还包括 'blame'(和 'blame_incremental')视图,虽然它默认是关闭的(因为它是 CPU hog)。
    • 阅读文档比阅读 GitHub 源代码更有趣(尤其是当文本很长并且需要时间渲染时)。第一个链接是git-config,第二个链接是the documentation。我猜“21.8”是指“2.18”? (我本可以进行修复,但我想先了解您的想法。)
    • @Fra 是的,2.18。我已经相应地编辑了答案。
    • @FranklinYu 我已包含您的链接(去年六月我为 Git 2.18 编辑此答案时没有链接)
    【解决方案3】:

    使用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 周用不同的颜色):

    如果你改进了它,评论the gist!喜欢就加星吧❤️

    【讨论】:

      【解决方案4】:

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

      [blame]
          date = human
      

      【讨论】:

      • 这应该是= relative
      • 有了这个,highlightRecent git blame 真的变得用户友好了,谢谢!
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 已经使用my small script 一年多了,我可以说这是一个值得付出的微小努力。 -s 标志对我来说还不够——我真的很关心作者和日期,如果可以避免的话,我不想再深入挖掘。此外,我的脚本会产生漂亮的彩色输出。
        【解决方案7】:

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

        您可以使用--date=&lt;format&gt; 选项(或blame.date 配置变量)更改日期格式,其中&lt;format&gt;相对、本地、默认、iso、rfc、short 之一。有关详细信息,请参阅 git-blamegit-log 联机帮助页。

        【讨论】:

        • 是的,--date 选项有点帮助,但它仍然没有我想要的那么好。并且 annotate 产生恕我直言,只是另一种丑陋的输出:P
        • @ReneSaarsoo:有用于责备/注释的 GUI,其中之一是 git gui blame
        • 有一个不错的脚本here 可以添加漂亮的格式和颜色。
        • 您也可以使用--date=format:XXXXX 获得更灵活的日期格式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-18
        相关资源
        最近更新 更多