Sam*_*Sam 5 git newline format-string git-log
我正在尝试开发一种要传递的格式字符串,git log --pretty以便每个日志条目以完整的提交消息结尾,但每个日志条目都由一个空行分隔。问题在于,有些完整提交消息以换行符结尾,有些则不然。
例如,假设我有两个提交abc1234和def5678,但仅abc1234在完整提交消息的末尾包含换行符。在命令行上输出原始提交内容将如下所示:
[prompt]$ git cat-file commit abc1234
(...)
Title FOO
Full commit message FOO
[prompt]$ git cat-file commit def5678
(...)
Title BAR
Full commit message BAR[prompt]$
Run Code Online (Sandbox Code Playgroud)
请注意新的 shell 提示符如何出现在最后一行输出的末尾,表明提交在完整提交消息的末尾def5678不包含换行符。
假设这def5678是父级abc1234,我想输出一个简单的日志,其中每个条目仅包含短提交哈希、标题行和完整提交消息。我可能会尝试这样的事情:
[prompt]$ git log --graph --pretty='commit %h%n%B' abc1234
* commit abc1234
| Title FOO
|
| Full commit message FOO
|
* commit def5678
| Title BAR
|
| Full commit message BAR
* commit <parent of def5678>
(...)
Run Code Online (Sandbox Code Playgroud)
请注意日志条目之间的间距。abc1234和 的条目def5678由空行分隔(图形字符除外),但def5678和 的父项则不是。
如何构造格式字符串以使间距保持一致,即使完整提交消息的终止不一致也是如此?内置的漂亮格式medium、full、fuller和email已经做到了这一点,但我希望能够构造任意格式字符串来完成同样的事情。
我已经尝试过%+B、%-B和% B序列(以及它们%b和%n等效项),但我似乎无法获得一致的间距。
如果有什么不同的话,我正在使用 Git 2.17.0。
正如 @jthill 在评论中提到的,并表达为git-log(1):
如果在占位符后面添加
-(减号)%,当且仅当占位符扩展为空字符串时,紧邻扩展之前的所有连续换行都会被删除。
因此,如果我们能找到一个始终%<token>扩展到空字符串的格式序列,我们可以用单个换行符替换零个或多个连续的换行符。事实证明,有这样一个格式序列:,空颜色选择器。(通常,括号内包含一个非空字符串,用于指定要在日志输出中使用的着色。有关更多详细信息,请参阅和。)%-<token>%n%C()git-log(1)git-config(1)
计算结果%C()为空字符串而不是导致错误的事实似乎是一个令人愉快的意外,而不是值得庆幸的事情,但至少对于 Git 2.17 来说,它做到了这一点。至此,我有足够的信息来回答我自己的问题。
为了保持 输出的日志条目之间的一致分隔git log --pretty=<tformat>(其中<tformat>可能会也可能不会计算出以换行符结尾的字符串),请附加%-C()%n到<tformat>。 例如:
[prompt]$ git log --graph --pretty='commit %h%n%B%-C()%n' abc1234
* commit abc1234
| Title FOO
|
| Full commit message FOO
|
* commit def5678
| Title BAR
|
| Full commit message BAR
|
* commit <parent of def5678>
(...)
Run Code Online (Sandbox Code Playgroud)