2010-09-02 77 views
28

我有一个简单的别名,显示最后几个提交:Git的日志表格格式

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

我怎样才能让显示在列的结果,像这样:

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

如果有一个能够执行此操作的Unix工具,我很想知道它!我能想到的最好的事情是Perl格式化输出,这是一个痛苦。 – zwol 2010-09-02 20:55:54

+3

@Zack:男人专栏是你的朋友。 – toong 2011-08-23 09:27:09

+0

不幸的是,这似乎是一个BSDism。 – zwol 2011-08-23 15:03:05

回答

37

在Git中1.8 0.3和以后,有在pretty format此本机支持,使用%<(N)语法来格式化下一个占位符作为ñ列宽:

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

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

这是Bash中的一个解决方案,使用read来分析日志行,printf将它们打印出来,对于作者名称使用固定宽度的字段,以便列保持排队。它假设|永远不会出现在作者的名字中;如果你认为这可能是一个问题,你可以选择另一个分隔符。每当面临

[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推移,

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”。现在,他们有两个问题。

当然,话说回来,我必须弄清楚如何做到这一点的awk这是一个有点短:

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

虽然这个工作原理 - 使用@Jesse建议的原生git-log方法是非常简洁的 – 2015-02-05 14:55:19

+0

@SeanBurlington当我在2010年编写这个答案时,它不存在;对于间距占位符的支持增加了[在2013年的1.8.3中](https://github.com/git/git/commit/a57523428b4c08795e793356e12afc3de812f84a)(尽管由于某些原因,它似乎是[从发行说明中缺失的] (https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.3.txt))。既然您已经指出有更好的解决方案可用,我已将其纳入我的答案。 – 2015-02-05 17:03:34

+2

我希望'%<(N)'语法可以在使用'--format'的Git的其他区域中工作,但现在似乎仅限于'--pretty'。在2013年,有一些关于使用'for-each'语法的[一些讨论](http://lists-archives.com/git/797299-for-each-ref-support-aligned-for-left-alignment.html) -ref --format'和一些'%(...:aligned)'的实验,但那个讨论似乎已经死亡。 – Dennis 2015-02-23 13:56:37

14

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

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

column命令“列”输出,使用“|”作为字段分隔符,它会在给定输入的情况下找出最佳的列宽度,所以即使您有更多的字段,它也可以很好地工作。

在Linux上,只要你不使用颜色,Linux的实现不能很好地处理ANSI escape codes

但在Mac OS X中,它将处理颜色,并且可以使用任何Unicode字符作为字段分隔符。我使用Σ,因为我很确定它不会偶然出现在提交文本中。 |是一个糟糕的选择,因为它可能会出现在提交说明书以及如果使用--graph --decorate --all它会显示为用来绘制图形符号的一部分

+0

第一个答案我看到了这个工作:'git log --pretty = format:'%cr |%s'-10 |列-t -s'''' – lightningleaf 2018-03-06 14:38:57

31

你也可以这样做:

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

无需用于外壳魔术或后期加工awkcolumn

+0

这似乎是迄今为止对我而言最好的解决方案。你在哪找到关于%<(20)语法的文档? – 2014-02-18 21:39:35

+1

它在'git help log'文档中引用,位于PRETTY FORMATS部分(我使用git 1.8.3.4版)。 – Conan 2014-02-25 11:52:10

+0

这是最短但最准确的答案。不需要其他任何东西,只需内置git日志。 – hanhp 2014-12-25 04:44:50

6

为了获得真正的表格格式,您还需要截断比例如长度更长的用户名。 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 
+0

@TamaMcGlinn希望这应该有所帮助 – insysion 2016-08-31 12:18:39