Git本地推送新分支时出现无效版本范围错误求助
问题:Git预接收钩子推送新分支时出现无效版本范围错误
问题场景
我在本地搭建裸仓库作为服务端,通过pre-receive钩子强制提交信息必须包含Jira工单ID或[NA]前缀,同时在客户端用prepare-commit-msg脚本自动从分支名提取工单ID补全提交信息。但推送新分支时,服务端抛出错误:
remote: fatal: Invalid revision range 0000000000000000000000000000000000000000..c15f3a1cb5875d944c8affcdec31f8b06a7e3ac4
错误根源
推送新分支时,远程仓库中该分支原本不存在,因此pre-receive钩子接收到的oldrev是全0的占位哈希(0000000000000000000000000000000000000000)。而git rev-list ${oldrev}..${newrev}无法处理全0哈希作为范围起点,直接抛出无效版本范围的错误。
解决方法
修改pre-receive钩子脚本,增加对全0oldrev的判断:当oldrev是全0时,改用git rev-list ${newrev}遍历该分支的所有提交(因为新分支的所有提交都是第一次推送到远程)。
修改后的完整脚本:
#!/bin/bash # Jira ticket pattern JIRA_TICKET_PATTERN="(^\[NA\])|(^\[[A-Z]+-[0-9]+\])" # Read the new references from standard input while read oldrev newrev refname; do # 处理新分支推送的情况(oldrev为全0哈希) if [ "$oldrev" = "0000000000000000000000000000000000000000" ]; then COMMITS=$(git rev-list "$newrev") else COMMITS=$(git rev-list "$oldrev..$newrev") fi # 遍历所有待推送的提交 for commit in $COMMITS; do # 获取提交信息 message=$(git log --format=%B -n 1 "$commit") # 检查提交信息是否符合要求 if [[ $message =~ $JIRA_TICKET_PATTERN ]]; then echo "Commit $commit 已包含合法前缀: ${BASH_REMATCH[0]}" else echo "MESSAGE $message" echo "ERROR:" echo "ERROR: 推送被拒绝,提交 $commit (分支 ${refname#refs/heads/})" echo "ERROR: 缺少JIRA工单ID或[NA]前缀,示例格式: '[MM-1234] 提交描述' 或 '[NA] 提交描述'." echo "ERROR:" echo "ERROR: 请修改提交信息后重新推送." echo "ERROR" exit 1 fi done done
额外注意事项
- 确保服务端的pre-receive钩子有可执行权限:在服务端仓库执行
chmod +x server/hooks/pre-receive - 客户端的prepare-commit-msg脚本同样需要添加可执行权限:
chmod +x .git/hooks/prepare-commit-msg - 当前正则表达式
JIRA_TICKET_PATTERN已严格限制提交信息必须以[NA]或[XX-123]开头,符合需求
内容的提问来源于stack exchange,提问作者Frendom
相关产品推荐
相关产品推荐

