【问题标题】:Git log tabular formattingGit 日志表格格式
【发布时间】:2011-04-07 13:22:13
【问题描述】:

我有一个简单的别名来显示几个最后的提交:

log --pretty=format:'%h %an %s' -10

如何使结果显示在列中,如下所示:

898e8789 Author1             Commit message here
803e8759 Other Author name   Commit message here

【问题讨论】:

  • 如果有一个罐装的 Unix 实用程序可以做到这一点,我很想知道它!我能想到的最好的事情是 Perl 格式的输出,这很痛苦。
  • @Zack: man column 是你的朋友。
  • 不幸的是,这似乎是一种 BSD 主义。
  • 它在 util-linux 包中。

标签: git bash scripting


【解决方案1】:

在 Git 1.8.3 及更高版本中,pretty format 对此提供原生支持,使用 %&lt;(<i>N</i>) 语法将下一个占位符格式化为 N 列宽:

$ git log --pretty=format:'%h %<(20)%an %s' -10

对于 1.8.3 之前的版本,此答案的先前版本(保留在下面)应该可以工作。

这是 Bash 中的一个解决方案,使用read 将日志行解析回分开,并使用printf 将它们打印出来,作者姓名的固定宽度字段使列保持对齐。它假定| 永远不会出现在作者的名字中;如果您认为这可能有问题,您可以选择其他分隔符。

git log --pretty=format:'%h|%an|%s' -10 | 
  while IFS='|' read hash author message
  do 
    printf '%s %-20s %s\n' "$hash" "$author" "$message"
  done

您可以使用以下方法将其创建为别名:

[alias]
    mylog = "!git log --pretty=format:'%h|%an|%s' -10 | while IFS='|' read hash author message; do printf '%s %-20s %s\n' \"$hash\" \"$author\" \"$message\"; done"

我相信您可以使用 awk 以更少的字符来执行此操作,但就像 the saying 一样,

每当遇到问题时,有些人会说“让我们使用 AWK”。现在,他们有两个问题。

当然,话虽如此,我必须弄清楚如何在awk中做到这一点,这有点短:

git ... | awk -F '|' '{ printf "%s %-20s %s\n", $1, $2, $3 }'

【讨论】:

  • 虽然这可行 - 使用 @Jesse 建议的本机 git-log 方法更整洁
  • @SeanBurlington 当我在 2010 年写这个答案时,它并不存在;添加了对间距占位符的支持in 1.8.3, in 2013(尽管出于某种原因,它似乎是missing from the release notes)。既然您已经指出有更好的解决方案可用,我已将其纳入我的答案中。
  • 我希望%&lt;(N) 语法可以在使用--format 的Git 的其他区域中工作,但目前似乎仅限于--pretty。在 2013 年有 some discussion 关于在 for-each-ref --format 中使用该语法以及对 %(...:aligned) 进行一些实验,但这种讨论似乎已经结束。
  • 有没有办法将固定大小也应用于图形?并且还要截断长度超过指定大小的字段?我正在尝试为所有内容制作一个固定位置的日志,因为这样看起来更容易。
  • 请注意,对于for-each-ref,您可以在格式中使用%(align:width=20,position=left),请参阅git-scm.com/docs/git-for-each-ref
【解决方案2】:

你也可以这样做:

git log --pretty=format:'%h %<(20)%an %s' -10

无需使用 awkcolumn 等进行 shell 魔术或后期处理。

【讨论】:

  • 这对我来说似乎是迄今为止最好的解决方案。您在哪里找到有关 %
  • 它在 git help log 文档中的 PRETTY FORMATS 部分下被引用(我使用的是 git 版本 1.8.3.4)。
  • 这是最短但最准确的答案。不需要其他任何东西,只需要内置 git log。
  • 这是 1.8.3 中的一个新选项,所以如果您使用的是 1.8.3 或更高版本,这绝对是一个更好的解决方案。我已将此建议纳入我的回答中,因为它由于被接受而处于首位,因此更有可能成为人们来到这里时看到的第一件事。
【解决方案3】:

以下命令将以表格形式打印日志

git log --pretty=format:'%h|%an|%s' -10 | column -t -s '|'

column 命令“列”输出,使用“|”作为字段分隔符,它将找出给定输入的最佳列宽,因此即使您有更多字段,它也能正常工作。

在 Linux 上,只要您不使用颜色,它就可以正常工作,Linux 实现不能很好地处理 ANSI escape codes

但在 Mac OS X 中,它将处理颜色,您可以使用任何 unicode 字符作为字段分隔符。我使用 ∑ 因为我很确定它不会在提交文本中偶然发生。 | 是一个糟糕的选择,因为它可能会出现在提交描述中,而且如果您使用 --graph --decorate --all,它将作为用于绘制图表的符号的一部分出现

【讨论】:

  • 我看到的第一个答案是:git log --pretty=format:'%cr|%s' -10 | column -t -s '|'
【解决方案4】:

为了获得真正的表格格式,您还需要截断比 e.g. 更长的用户名。 20 个字符:

git log --pretty=format:'%h %<(20,trunc)%an %s' -10

此外,如果您要输出到终端,您可能希望通过截断提交消息字段来防止行溢出:

git log --pretty=format:'%h %<(20,trunc)%an %<(39,trunc)%s' -10

或换行并缩进任何溢出的行以对齐:

git log --pretty=format:'%w(79, 0, 29)%h %<(20,trunc)%an %s' -10

编辑:上面的示例将终端宽度硬编码为 79 个字符。在 POSIX 系统上,您可以使用 tput cols 返回宽度:

git log --pretty=format:'%w(`tput cols`, 0, 29)%h %<(20,trunc)%an %s' -10

git log --pretty=format:'%w($((`tput cols`-1)), 0, 29)%h %<(20,trunc)%an %s' -10

不幸的是,最后两个打破了git alias,所以它需要一个终端别名(除非你真的喜欢打字)。

【讨论】:

  • @TamaMcGlinn 希望这会有所帮助
  • 感谢tput cols 部分,这对于制作匹配可变终端大小的格式非常有用:D
【解决方案5】:

如何添加标签?

你要找的是:

%x09

这是一个例子

git log --pretty=format:"%C(magenta)%h %C(cyan)%C(bold)%ad%Creset %C(cyan)%cr%Creset%x09 | %s %C(green)%Creset" --date=short

我希望将相对日期标记为选项卡,因为它不是固定长度,这样所有列都排成一行(对于不到一年前的任何内容)。想让它一直排成一行,但这是我在时间用完之前所能做到的(具有讽刺意味的是)。

希望这会有所帮助!

如果您有建议来改进此答案以解决相对年份案例(不仅仅是找出年份)也很高兴听到这些建议,如果您知道如何操作,请随时编辑此答案以添加它们。

【讨论】:

    【解决方案6】:

    表格格式的问题在于您可能会用完空间......

    以下是我个人在展示的基本内容之间的最佳折衷:

    • 做了什么
    • 以及何时
    • 能够通过how 的提交哈希挖掘更多信息

    所以:

      git log --pretty --format='%h %aI %<(15)%an ::: %s'
    

     git log --pretty --format='%h %cI %<(15)%an ::: %s'
    

    if you want to get the commiter time and not the author time

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 2015-09-20
      • 2019-07-16
      • 2011-12-12
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 2019-12-28
      • 2016-06-18
      相关资源
      最近更新 更多