Git commit-msg钩子正则优化:匹配两种合法提交消息格式
Git Commit-Msg钩子正则优化方案
问题背景
为Git的commit-msg钩子编写正则时,现有规则仅能校验到-符号之后的任意内容,无法实现两种提交格式的严格校验:
- 当
-后以(开头时,需验证括号成对,且闭括号后必须跟空格:空格+提交描述 - 当
-后以字母数字开头时,直接匹配普通提交描述
之前尝试的析取正则因第二个分支.+会匹配所有内容导致规则失效,同时需要拦截以下无效格式:
- GRP-0988 FIX CORE - (Some change) (括号后无
:和描述) - GRP-0988 FIX CORE - (Some change) - Some description (括号后格式错误)
- GRP-0988 FIX CORE - ( (括号未闭合且无内容)
- GRP-0988 FIX CORE - () (括号内为空)
- GRP-0988 FIX CORE - (Some change (括号未闭合)
- GRP-0988 FIX CORE - Some change) (以
)开头的描述)
解决方案
调整正则分支顺序,优先匹配更具体的格式,同时限制括号内内容和描述的合法性:
/^GRP\-[0-9]+\s(FIX|CHANGE|HOTFIX|FEATURE)\s(CORE|SHARED|ADM|CSR|BUS|OTHER)\s-\s(?:\([^)]+\)\s:\s[a-zA-Z0-9].+|[a-zA-Z0-9].+)$/
规则说明
^和$:确保整个提交消息完全匹配,避免前后多余内容(?:...):非捕获组,用于包裹两个格式分支,不产生额外捕获结果- 第一个分支
\([^)]+\)\s:\s[a-zA-Z0-9].+:\([^)]+\):匹配成对的括号,且括号内必须有非空内容([^)]+匹配除)外的任意字符)\s:\s:强制括号后跟随空格:空格的格式[a-zA-Z0-9].+:确保描述以字母数字开头,且有后续内容
- 第二个分支
[a-zA-Z0-9].+:确保普通描述以字母数字开头,拦截以特殊字符(如))开头的无效内容
验证效果
- 有效格式均可匹配:
GRP-0888 FIX OTHER - (jest.config.js) : Fix testMatch option issueGRP-0888 FIX OTHER - Fix testMatch option issue
- 所有列出的无效格式均会被拦截,无法通过校验
内容的提问来源于stack exchange,提问作者Norayr Ghukasyan
相关产品推荐
相关产品推荐

