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

借助GitLab钩子阻止合并请求(MRs)的技术实现问题

阻止main分支合并到release系列分支的可行方案

方案一:使用GitLab分支保护规则(推荐,无需自定义脚本)

GitLab原生的分支保护功能可直接实现需求,配置简单、维护成本低:

  • 进入目标仓库的「设置」→「仓库」→「分支保护」
  • 新建保护规则,在「分支名称」处填入正则表达式 ^release.*
  • 在「允许合并的源分支」中添加排除规则:选择main分支,设置为禁止合并到当前保护的分支
  • 额外勾选「不允许跳过分支保护」,确保所有用户(包括管理员)无法绕过规则
  • 该方式直接从平台层面限制合并来源,完全贴合Git-Flow流程,无需编写自定义脚本

方案二:编写正确的pre-receive钩子脚本(适合复杂自定义规则)

你之前的钩子脚本未正确获取上下文信息——Git(含GitLab)的pre-receive钩子是从标准输入读取分支变更数据,而非命令行参数。每行输入格式为 old_ref new_ref ref_name,据此可实现合并拦截:

示例脚本

#!/bin/bash

# 定义拦截规则:禁止main分支合并到release开头的分支
FORBIDDEN_SOURCE="refs/heads/main"
TARGET_BRANCH_REGEX="^refs/heads/release.*"
LOG_FILE="/var/log/gitlab/pre_receive_hook.log"

# 初始化日志目录(确保Git用户可写)
mkdir -p $(dirname $LOG_FILE)
chown git:git $(dirname $LOG_FILE) 2>/dev/null

# 记录钩子触发日志
echo "[$(date '+%Y-%m-%d %H:%M:%S')] pre-receive钩子触发" >> $LOG_FILE

# 读取标准输入的分支变更数据
while read OLD_REF NEW_REF REF_NAME; do
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检测到分支操作:$REF_NAME(旧哈希:$OLD_REF,新哈希:$NEW_REF)" >> $LOG_FILE

    # 检查目标分支是否匹配release系列分支
    if [[ $REF_NAME =~ $TARGET_BRANCH_REGEX ]]; then
        # 统计目标分支变更中包含的main分支提交数量
        MAIN_COMMIT_COUNT=$(git rev-list --count $OLD_REF..$NEW_REF -- $FORBIDDEN_SOURCE)
        if [[ $MAIN_COMMIT_COUNT -gt 0 ]]; then
            echo "ERROR: 禁止将main分支合并到release系列分支,请遵循Git-Flow流程,未测试特性不得进入生产分支"
            echo "[$(date '+%Y-%m-%d %H:%M:%S')] 拦截操作:禁止main分支合并到$REF_NAME" >> $LOG_FILE
            exit 1
        fi
    fi
done

exit 0

部署说明

  1. 将脚本放置在GitLab仓库对应的custom_hooks目录下(通常路径为 /var/opt/gitlab/git-data/repositories/<group>/<project>.git/custom_hooks/pre-receive)
  2. 赋予脚本执行权限:chmod +x pre-receive
  3. 确保Git用户(通常为git)拥有脚本执行权限和日志文件写入权限

注意事项

  • 分支保护规则是官方推荐方案,无需维护脚本,规则变更更直观
  • 钩子脚本需适配Gitaly运行环境,权限配置错误会导致钩子失效
  • 两种方案均能实现「不受用户权限限制」的需求:分支保护规则默认对所有用户生效(含管理员),钩子脚本会拦截所有推送/合并操作,与用户权限无关

内容的提问来源于stack exchange,提问作者Geiser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:30:32