4

我想git log在项目中使用仅查看提交消息中包含多行的提交(即它们有更长的描述)。解决此问题的最佳方法是什么?

我试过git log --grep='\n\n'了,它提出了一个包含多行的提交列表,但这不是一个完整的列表。(我手动回顾了一些完整的日志,并很快找到了包含我的命令未输出的多行消息的提交。)

然后我也尝试git log --grep='\n\r\?\n'了 ,以防某些提交中有 Windows 样式的行结尾(我正在使用msysgit,所以它可能是可能的?),但它得到了与上面相同的输出。

4

2 回答 2

6

这似乎对我有用(在 Linux 上):

git log --pretty=format:'%H<msgst>%b<msge>' \
| fgrep -v '<msgst><msge>' | fgrep '<msgst>' | cut -b1-40 \
| git log --stdin --no-walk

基本上:打印提交哈希和提交消息正文(减去主题行)包含在一些不常见的字符串中,排除此类正文为空的行(例如,消息中没有换行符的提交),然后只取第一行(那些在开头),并且只打印哈希值。

于 2012-08-06T14:02:55.617 回答
0

对于一些额外的上下文:

--grep='\n\n'使用时发生的事情\n并不特别,所以它只是意味着n

您得到的结果与--grep='nn'.


至于你的实际问题:

请注意,--grep在换行符处拆分提交消息并将模式分别与每个子字符串匹配。这意味着您不能编写一个模式--grep来确定它是否与第一行不同的行匹配。

此外,由于每条提交消息都以换行符结尾,因此拆分总是会产生至少一个完全空的子字符串。这意味着每个提交都匹配--grep='^$'

因此,绝对没有办法使用--grepto limitgit log的输出来提交多行消息。


所以这样做的唯一方法是使用che's answer中给出的方法。正如我在那里评论的那样,我建议这种特殊的形式:

git log --format='%H%x09%x09%x09%b' \
| egrep '^[0-9a-f]{40}\t\t\t.' \
| cut -f1 \
| git log --stdin --no-walk   # or whatever

在这个版本中,grep保留以提交 ID 开头的行,后跟 3 个制表符,后跟任何字符(即不后跟任何字符,即那些是感兴趣的提交)。这种模式极不可能出现在提交消息正文中,不需要一秒钟grep来过滤掉提交消息正文行,并且制表符也恰好是默认字段分隔符,cut因此它也更短。

于 2021-11-27T05:05:05.093 回答