如何在Github上阻止提交者合并含自身提交的PR?预接收钩子咨询
如何阻止提交过代码的用户审批/合并包含自身提交的PR?
一、GitHub原生解决方案(无需自定义钩子)
如果使用GitHub.com或GitHub Enterprise Server,直接通过分支保护规则就能实现需求:
- 进入仓库「Settings」→「Branches」页面,找到「Branch protection rules」
- 新建或编辑目标分支的保护规则:
- 勾选「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
配置步骤
- 将上述脚本保存为
pre-receive文件,自建服务器直接放在仓库的.git/hooks目录下;GitHub Enterprise Server需在仓库设置的「Hooks」中添加该脚本。 - 给脚本添加执行权限:
chmod +x .git/hooks/pre-receive - 根据服务器认证方式调整
current_user的获取逻辑:- HTTPS推送可从
REMOTE_USER等环境变量获取用户信息 - 若用户标识不是邮箱,修改
git log的输出格式(比如%an获取用户名)
- HTTPS推送可从
注意:GitHub.com不支持自定义预接收钩子,只能使用前文的分支保护规则实现需求。
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

