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

如何在Github上阻止提交者合并含自身提交的PR?预接收钩子咨询

如何阻止提交过代码的用户审批/合并包含自身提交的PR?

一、GitHub原生解决方案(无需自定义钩子)

如果使用GitHub.com或GitHub Enterprise Server,直接通过分支保护规则就能实现需求:

  1. 进入仓库「Settings」→「Branches」页面,找到「Branch protection rules」
  2. 新建或编辑目标分支的保护规则:
    • 勾选「Require pull request reviews before merging」(要求拉取请求在合并前获得批准)
    • 勾选「Dismiss stale pull request approvals when new commits are pushed」(推送新提交时取消过时的审批)
    • 关键选项:勾选「Do not allow committers to approve their own pull requests」——无论PR是谁创建的,只要用户在PR中有提交记录,就无法审批该PR
    • 若开启了「Allow edits by maintainers」,编辑PR的用户也会被视为提交者,规则同样生效

该规则会直接限制所有在PR中提交过代码的用户(包括创建者和协作者),无法审批或合并包含自身提交的PR。

二、预接收钩子配置(适用于自建Git服务器/GitHub Enterprise Server)

如果是自建Git服务器或需要更自定义的逻辑,可通过预接收钩子阻止包含自身提交的合并操作——预接收钩子在服务器端运行,会在代码推送/合并前触发检查。

示例bash脚本

#!/bin/bash

# 读取预接收钩子的标准输入(格式:old_rev new_rev ref_name)
while read oldrev newrev refname; do
    # 获取当前执行推送/合并操作的用户(以SSH登录用户为例,需根据服务器环境调整)
    current_user=$(whoami)
    
    # 获取本次推送中所有提交的作者邮箱和提交者邮箱,去重后输出
    committers=$(git log --format='%ae %ce' "$oldrev..$newrev" | tr ' ' '\n' | sort -u)
    
    # 检查当前用户邮箱是否在提交者列表中(替换为你的域名或用户标识规则)
    if echo "$committers" | grep -q "^${current_user}@your-domain.com$"; then
        echo "ERROR: 无法合并包含你自己提交的分支/PR"
        exit 1  # 返回非0值阻止推送
    fi
done

exit 0

配置步骤

  1. 将上述脚本保存为pre-receive文件,自建服务器直接放在仓库的.git/hooks目录下;GitHub Enterprise Server需在仓库设置的「Hooks」中添加该脚本。
  2. 给脚本添加执行权限:
    chmod +x .git/hooks/pre-receive
    
  3. 根据服务器认证方式调整current_user的获取逻辑:
    • HTTPS推送可从REMOTE_USER等环境变量获取用户信息
    • 若用户标识不是邮箱,修改git log的输出格式(比如%an获取用户名)

注意:GitHub.com不支持自定义预接收钩子,只能使用前文的分支保护规则实现需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:15:27