如何修复git log --graph中的对齐问题

时间:2018-09-01 14:11:01

标签: git pretty-print text-alignment

如果没有可用的GUI,我正在使用以下别名在控制台上呈现git提交历史记录:

$ git config alias.treex
log --color --graph --pretty=format:'%C(cyan)%h%Creset - %C(cyan)%ad%Creset %<(80,trunc)%s   %C(cyan)%>(20,trunc)%an - %Cgreen%>(12)%cr%Creset' --date=format:'%d.%m.%Y %H:%M' --abbrev-commit --all

虽然格式字符串使用对齐和固定大小的字符串格式,例如%<(80,trunc)%s,但git log --graph呈现的图形破坏了对齐方式:

Git treex result.
(点击放大)

如何通过图形本身解决对齐错误的问题?

2 个答案:

答案 0 :(得分:2)

您可以使用%<(80,trunc)%s告诉主题渲染主题直到到达git log为止,而不是%<|(110,trunc)%s告诉主题110使用80个字符进行渲染。输出的> th 列。这样,主题之后的下一个字段从111 st 列开始,并且顺序被恢复。
({110大约是您想要主题的原始80字符加上其前面各列的大小(%h = 7字符,{{1} } = %ad个字符)以及您在它们之间放置的定界符。)

您当然可以使用其他值。您也可以尝试限制第一个字段(16)的宽度,以使所有其他字段对齐,但是在包含很多分支的历史记录部分上,该字段无法正确对齐; %h字段很大,并使用足够的列来容纳两个并发分支。

该格式在%s格式下的documentation of git log中进行了描述,并且它存在于文档页面的所有版本中(不幸的是,它们以<()开头)。如果您使用的是较旧的Git版本,则该格式可能对您不可用。在这种情况下,最好的建议是将您的Git更新到最新版本。

答案 1 :(得分:2)

移动%h占位符以进行对齐

正如axiac前面提到的,您可以限制第一个字段的宽度。例如,如果在格式定义的开头添加%>|(16),则可以移动缩写的提交哈希(%h)至少在第16列结束。如果您将%h的7位数字和一个额外的空格字符相减,则图形的范围将为8位数字。

您原始的git日志历史记录格式: Unaligned git log history

通过为%>|(16)添加%h来实现更统一的版本: Aligned git log history

添加长度参数

正如axiac也提到的那样,该解决方案将面临问题。一旦图形超过8个字符的长度,由于一个项目包含许多并行分支,则日志条目的偏移量将更大。您将不得不根据当前Git项目的情况来调整别名。幸运的是有一个trick for powerful Git aliases。使用此技巧,您可以将一个参数传递给您的别名,该参数设置移位列的数量。

使用参数30调用别名,然后将Git日志历史记录条目移动22列: Aligned git log history with argument

设置长度参数的默认值

现在,您并不是每次都打算通过别名来传递列数。 link解释了如何设置默认参数。这样,您的别名将引用一次不带参数的默认值。一旦完成操作,我们就可以直接在别名内部更正8位数字的偏差。因此,传递的参数直接对应于实际移位的列。

最终别名

您的最终Git别名接受一个参数,以将x列的Git日志条目移位,默认移位8位:

$ git config --global alias.treex
!f() { x=${1-16}; length=`expr $x + 8`; git log --color --graph --pretty=format:"%>|($length)%C(cyan)%h%Creset - %C(cyan)%ad%Creset %<(80,trunc)%s   %C(cyan)%>(20,trunc)%an - %Cgreen%>(12)%cr%Creset" --date=format:%d.%m.%Y; }; f