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

How to fix alignment problem in git log --graph

如果没有可用的 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 渲染的图形破坏了对齐方式:


(点击放大)

如何修复图表本身导致的对齐中断?

代替 %<(80,trunc)%s 告诉 git log 在 80 个字符上渲染主题,您可以使用 %<|(110,trunc)%s 告诉它渲染主题直到它到达 110输出的第 th 列。这样,主题之后的下一个字段从 111st 列开始,并且恢复了顺序。
(110 大约是你想要的主题的原始 80 个字符 + 它前面的列的大小(%h = 7 个字符,%ad = 16 个字符)以及您在它们之间放置的分隔符。)

当然你可以使用不同的值。您还可以尝试限制第一个字段的宽度 (%h) 以使所有其他字段对齐,但它不会在包含大量分支的历史部分上正确对齐; %s 字段很大并且使用了足够的列来容纳两打并发分支。

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

移动 %h 占位符以对齐

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

的范围

您原来的git日志历史格式:

%h 添加 %>|(16) 的更一致的版本:

添加长度参数

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

使用参数 30 调用您的别名,然后将您的 Git 日志历史条目移动 22 列:

设置长度参数的默认值

现在,您可能无意在每次调用别名时都传递列数。 link 解释了如何设置默认参数。这样,您的别名在没有参数的情况下引用一次默认值。一旦我们做到这一点,我们就可以直接在别名内部纠正 8 digits 的偏差。因此,传递的参数直接对应于实际移动的列。

最终别名

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

$ 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