Git commit-msg钩子校验提交信息失败,求排查原因
问题分析与解决
你的commit-msg钩子脚本存在两个关键问题,导致提交信息校验失败:
1. 正则表达式字符集写法错误
在正则的[a-zA-Z0-9-_ ]部分,减号-位于0-9和_之间,会被解析为字符范围(从ASCII码的9到_),而非单独的允许字符。这个范围包含了:、<、@等你原本未打算允许的字符,同时打乱了预期的字符匹配逻辑。
2. 提交信息文件的换行符干扰匹配
使用git commit -m提交时,Git会将提交信息写入临时文件,文件末尾会自动添加换行符。$(cat $1)会读取整个文件内容(包含该换行符),导致实际匹配的字符串为"9: texttexttexttexttexttexttexttext\n"。你的正则^...$要求字符串结尾严格匹配提交信息的最后一个字符,换行符的存在使得$无法匹配到正确位置,最终校验失败。
修正后的脚本
#!/bin/sh # 修正字符集:将减号移到末尾,避免被解析为范围 valid_commit_msg_regex="^[0-9]+:[a-zA-Z0-9_ -]{20,150}$" message="This commit violates the commit message rules. Please rename your commit." # 读取提交信息并移除末尾的换行符 commit_msg=$(tr -d '\n' < "$1") if [[ ! "$commit_msg" =~ $valid_commit_msg_regex ]] then echo "$message" exit 1 fi exit 0
你也可以通过修改正则,允许末尾存在换行符来解决第二个问题:
valid_commit_msg_regex="^[0-9]+:[a-zA-Z0-9_ -]{20,150}\n?$"
修改后,你的测试提交信息"9: texttexttexttexttexttexttexttext"即可通过校验。
内容的提问来源于stack exchange,提问作者Dark_Phoenix
相关产品推荐
相关产品推荐

