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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:52:51