Husky commit-msg钩子正则表达式匹配失败问题求助
问题排查与解决方案
你的提交信息符合格式却被钩子拒绝,核心原因是提交信息字符串末尾带有换行符,而你的正则表达式没有考虑这种情况,导致匹配失败。
具体分析
Git生成的commit-msg文件末尾默认会带有换行符,你通过msg=$(cat $1 | sed '/^#.*/d')获取的内容会包含这个换行符。而正则中的.+无法匹配换行符(默认.不匹配换行),导致整个字符串无法满足正则的匹配条件。
此外,原正则中的Merge|Revert|Apply部分没有锚定行首行尾,可能会错误匹配包含这些词的其他提交信息(比如Merge feature branch),建议修正为精确匹配整行。
修复方案
你可以任选以下两种方案之一:
方案1:获取提交信息时去掉末尾换行符
修改钩子中的msg赋值行,添加去除换行的处理:
msg=$(cat "$1" | sed '/^#.*/d' | tr -d '\n')
这里用tr -d '\n'删除所有换行符,确保msg是纯提交文本内容。
方案2:修改正则表达式,兼容末尾空白字符
调整正则,允许末尾存在空白字符(包括换行),并精确匹配Merge/Revert/Apply:
PATTERN_COMMITS='(^IMO-[0-9]+\s#time\s([0-9]+([.][0-9]+)?[wdhm])([ ][0-9]+([.][0-9]+)?[wdhm])*\s\|\s[[:alnum:]_].+\s*$|^Merge$|^Revert$|^Apply$)'
\s*$:匹配末尾任意数量的空白字符(包括换行)^Merge$:精确匹配整行内容为Merge的提交,避免误匹配
另外,建议将cat $1改为cat "$1",避免文件名含空格时出现异常。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

