使用commit-msg钩子校验Git提交信息时正确格式被误判报错
正则匹配失效原因
- Bash 原生
=~操作符使用的是POSIX扩展正则(ERE),不支持你正则里写的\r转义匹配:Git在Unix-like系统下生成的提交信息临时文件使用LF(\n)作为换行符,硬编码[\r\n]无法正确匹配实际换行,部分场景下甚至会把\r识别成普通字符导致匹配失效。 - 正则开头的
\s*[\r\n]逻辑错误:要求Type:行前方必须先存在一个空行,但符合规范的提交信息是第一行描述直接换行接Type:行,这个写法强制要求两行之间有空行,和实际输入结构不匹配。 - 现有正则未覆盖Jiras字段校验,就算Type行匹配通过,不符合Jira编号规则的提交也会被漏放。
修复方案
直接替换为以下修复后的commit-msg钩子代码即可,完全适配你要求的提交规范,兼容跨平台换行场景:
#!/bin/bash MSG="$1" # 正则匹配规则: # 1. 第一行:至少4个字符的简短描述 # 2. 第二行:Type字段,值限定为Internal/Bugfix/New Feature/Enhancement,冒号前后允许任意空白 # 3. 第三行:Jiras字段,支持指定前缀的Jira编号,多个编号用逗号分隔 # 4. 第三行之后:允许追加任意自定义补充内容 MATCH="^.{4,}[[:space:]]* Type:[[:space:]]*(Internal|Bugfix|New Feature|Enhancement)[[:space:]]* Jiras:[[:space:]]*((PRODUCTS|SYSDEV|LOCSRV|LTESYS|SRD|WIFI|MCU|SLBL|GNSS|SYSTOOL)-[0-9]+(,[[:space:]]*))*[[:space:]]*(\$|(.|\n)*)" commit_content=$(cat "$MSG") if [[ ! "$commit_content" =~ $MATCH ]]; then echo "提交信息格式不符合规范,请按以下结构编写:" echo "第一行:单行功能/改动描述(不少于4个字符)" echo "第二行:Type: 取值为 Internal / Bugfix / New Feature / Enhancement 其中之一" echo "第三行:Jiras: 关联的Jira单号,多个单号用逗号分隔" echo "后续行:可追加任意问题说明、改动细节等内容" exit 1 fi
修复点说明
- 用POSIX标准的
[[:space:]]替代\s、\s*写法,兼容Bash所有版本的正则解析,可匹配空格、制表符、跨平台换行残留字符。 - 正则中的换行直接在变量定义时输入真实换行,比转义
\n的兼容性更稳定,不会出现转义符不被识别的问题。 - 补全了Jiras字段的校验逻辑,覆盖你列出的所有Jira项目前缀,支持多单号场景。
- 你提供的测试提交内容可正常通过校验,缺字段、Type值非法、Jira单号格式错误的提交都会被拦截。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

