如何修复 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 列。这样,主题之后的下一个字段从 111
st 列开始,并且恢复了顺序。
(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
如果没有可用的 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 列。这样,主题之后的下一个字段从 111
st 列开始,并且恢复了顺序。
(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