Git日志表格格式

tak*_*hin 40 git bash scripting

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

log --pretty=format:'%h %an %s' -10
Run Code Online (Sandbox Code Playgroud)

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

898e8789 Author1             Commit message here
803e8759 Other Author name   Commit message here
Run Code Online (Sandbox Code Playgroud)

Bri*_*ell 56

在Git 1.8.3及更高版本中,以漂亮的格式对此进行本机支持,使用语法将下一个占位符格式化为N列宽:%<(N)

$ git log --pretty=format:'%h %<(20)%an %s' -10
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令将其创建为别名:

[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"
Run Code Online (Sandbox Code Playgroud)

我相信你能做到这一点,使用更少的字符,awk俗话说得好,

每当遇到问题时,有人会说"让我们使用AWK."现在,他们有两个问题.

当然,话虽如此,我不得不弄清楚如何做到这awk一点有点短:

git ... | awk -F '|' '{ printf "%s %-20s %s\n", $1, $2, $3 }'
Run Code Online (Sandbox Code Playgroud)

  • 我希望`%<(N)`语法可以在Git的其他区域使用`--format`,但现在似乎只限于`--pretty`.在2013年,有一些讨论(http://lists-archives.com/git/797299-for-each-ref-support-aligned-for-left-alignment.html)关于使用`for-each'的语法-ref --format`和一些'%(...:aligned)`的实验,但这个讨论似乎已经死了. (2认同)
  • 有没有办法将固定大小应用于图表?还要截断超过指定大小的字段?我正在尝试使用固定位置制作一个日志,因为这对眼睛来说更容易. (2认同)
  • 请注意,对于`for-each-ref`,您可以在格式中使用`%(align:width = 20,position = left)`,请参阅https://git-scm.com/docs/git-for-each- REF (2认同)

Jes*_*sse 35

你也可以这样做:

git log --pretty=format:'%h %<(20)%an %s' -10
Run Code Online (Sandbox Code Playgroud)

无需外壳魔法或后处理用awk,column等等.


ece*_*ulm 16

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

git log --pretty=format:'%h|%an|%s' -10 | column -t -s '|'
Run Code Online (Sandbox Code Playgroud)

命令"columnates"的输出,采用了"|" 作为字段分隔符,它将在给定输入的情况下找出最佳列宽,因此即使您有更多字段也能正常工作.

在Linux上它只要你不使用颜色就可以正常工作,Linux实现不能很好地处理ANSI转义码.

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


ins*_*ion 10

为了获得真正的表格格式,您还需要截断超过例如20个字符的用户名:

git log --pretty=format:'%h %<(20,trunc)%an %s' -10
Run Code Online (Sandbox Code Playgroud)

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

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

或包裹线条并缩进任何溢出的线条以对齐:

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

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

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

要么

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

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


jas*_*ard 10

如何添加标签?

您正在寻找的是:

%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
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!

如果您有关于改进相对年份案例的答案的建议(而不仅仅是找出年份),也很高兴听到它们,如果您知道如何做,请随时编辑此答案以添加它们。

编辑:

我决定也尝试一下%<(n)另一个人建议的语法,我发现如果你有超过 9 年的东西,那么它就太短了,10 年是使用%<(20)建议的多一个数字。相反,我建议%<(23)

git log --pretty=format:"%C(magenta) %h %C(cyan)%C(bold)%ad%Creset %<(23) %C(cyan)%cr%Creset %s%C(green)%Creset" --date=short`
Run Code Online (Sandbox Code Playgroud)

除非这个项目已有 100 多年的历史,否则它会很好地排列起来。但如果你想让它起作用,你只需添加 1 即可%<(24)