如何仅在Git提交日志的首行(主题)中搜索指定内容?
精准匹配Git提交主题首行的方法
要只匹配提交消息**首行(主题)**包含指定文本的提交,有两种可靠方案,完全避免误匹配正文内容:
方案1:使用Git内置的主题匹配参数(Git 2.27.0+)
从Git 2.27.0版本开始,git log新增了--grep-subject选项,它会让--grep的正则仅作用于提交消息的首行(主题),不会扫描正文内容。
比如要搜索所有主题以Job: sync开头的提交,直接执行:
git log --grep='^Job: sync' --grep-subject
针对你原来的提取<unique-id>的脚本,修改后是:
git log --pretty=format:"%s" --grep='^Job: sync' --grep-subject -n 1 | awk '{print $3}'
方案2:兼容旧Git版本的通用方法
如果你的Git版本低于2.27.0,可以通过git log输出主题内容,再用文本工具过滤仅首行符合要求的提交。
比如要提取最新的目标提交的<unique-id>:
git log --pretty=format:"%s" | grep '^Job: sync' | head -n 1 | awk '{print $3}'
如果需要输出这些提交的完整日志信息,可以先提取符合条件的提交哈希,再单独查看:
# 提取所有符合条件的提交哈希 git log --pretty=format:"%h|%s" | awk -F'|' '$2 ~ /^Job: sync/ {print $1}' | xargs git log --oneline
为什么原来的--grep='^Job: sync'有风险?
git log --grep默认会扫描整个提交消息(包括首行和所有正文行),正则里的^匹配的是消息内任意一行的开头,如果有人在提交正文里写了一行以Job: sync开头的内容,这个提交也会被匹配到,导致脚本出错。而上面的两种方案都只限定匹配提交的首行,彻底解决了这个问题。
内容的提问来源于stack exchange,提问作者Svintoo
相关产品推荐
相关产品推荐

