合并由 Git 包装的提交消息行

Merge Commit Message Lines wrapped by Git

当我为我的一个项目键入提交消息时,它们通常采用以下格式:

My Commit Header

main: Added a new class
doc: Documented the method that was added to main under the name `FooBar.baz()`.
subproject: Did something that requires a really long description.

这些的问题在于它们被 Git 自动包装。当使用 git log 生成变更日志时,我通常会得到这样的结果(使用仅打印正文的格式):

main: Added a new class
doc: Documented the method that was added to main
under the name `FooBar.baz()`.
subproject: Did something that requires a
really long description.

我现在要做的是合并这些行,以便输出中的每一行都以 tag: 开头并以句点 . 结尾。不幸的是,线条也可以包含点,如第二个示例所示。所以行尾可能定义为一个句点后跟一个换行符。

我可以使用正则表达式 ^[\w()]+:.*\n.*\.$,但我不知道如何使用 grep.

将其应用于多行

有没有办法使用标准 Unix / Mac OS 命令合并匹配正则表达式的两条线?

不是 git 在您的提交消息中换行。它是您用来编写提交消息的编辑器。因此,要禁用换行,您必须正确配置编辑器。但是请注意,这可能与普遍接受的 etiquette of writing good commit messages.

相反

因此,更明智的做法是允许编辑器换行,并在查看更新日志时恢复它们,正如您所要求的那样。以下脚本将完成展开工作(展开不会跨越由空行定义的边界):

unwrap_commit_message_lines

#!/bin/bash

# This script is for the GNU variant of sed!
sed -n -e '/^$\|^[^ :]\+: / {x;p;d}'                               \
       -e '/^[^ :]\+: /! {H;x;s/\(^[^ :]\+: .\+\) *\n */ /;x};'  \
       -e '$ {x;p};'                                               \

用法示例:

$ git log --format=format:'------------%ncommit %H%n%n%b'|unwrap_commit_message_lines