You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:12:28