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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:55:17