如何限制开发者在分支未与master同步时推送至对应远程分支
方案可行性判断
Git hook是完全适配该需求的解决方案,优先选择服务端pre-receive钩子实现强制校验,不要依赖客户端pre-push钩子:客户端钩子存储在开发者本地仓库,可被手动禁用、绕过,而服务端钩子是全局强制规则,所有推送请求到达服务端后必须先经过钩子校验,无法被开发者绕过。
具体实现方法
自建裸Git服务端(无可视化管理面板)
直接修改服务端仓库的pre-receive钩子即可,操作步骤如下:
- 进入服务端对应Git裸仓库的根目录,找到
hooks子目录,基于样本文件创建可执行钩子:
cp pre-receive.sample pre-receive chmod +x pre-receive
- 编辑
pre-receive文件,加入如下核心校验逻辑:- 先获取当前服务端
master分支的最新commit哈希值 - 校验开发者推送的分支commit的祖先链中是否包含master的最新哈希,不包含则说明该分支没有合并最新master代码,直接拒绝推送
- 拒绝时返回友好提示,告知开发者需要先执行
git pull origin master合并最新master代码后再尝试推送
- 先获取当前服务端
用GitLab/GitHub/Gitee等托管平台
不需要手动写钩子,直接在平台的仓库设置里配置分支规则即可:
- 进入仓库的「设置-分支保护/分支规则」页面
- 给所有开发者的个人开发分支开启「推送前必须与目标基准分支(master)保持同步」的规则,平台会自动完成校验,比手写钩子稳定性更高。
补充说明:如果合并代码时经常出现冲突,可以要求开发者本地用
git rebase origin/master替代git pull origin master,合并后分支提交记录更整洁,后续你合并到master的时候冲突更少。
内容的提问来源于stack exchange,提问作者AlASAD WAIL
相关产品推荐
相关产品推荐

