如何在本地设置类似Github的分支保护,避免误推代码到master分支?
本地Git分支推送防护实现方案
方案1:pre-push钩子实现(最稳定,支持全局/单仓库配置)
pre-push是Git原生提供的推送前触发的钩子,拦截逻辑不依赖个人使用习惯,防护不会失效。
- 全局生效配置(对所有本地仓库生效):
- 先创建全局钩子模板目录:
mkdir -p ~/.git-templates/hooks git config --global init.templatedir '~/.git-templates'- 在
~/.git-templates/hooks目录下新建pre-push文件,写入以下内容:
#!/bin/sh # 自定义需要禁止推送的受保护分支,多个用空格分隔 PROTECTED_BRANCHES="master main prod production" # 获取当前所在分支名 current_branch=$(git rev-parse --abbrev-ref HEAD) # 分支匹配校验 for protected_branch in $PROTECTED_BRANCHES; do if [ "$current_branch" = "$protected_branch" ]; then echo "[错误] 禁止直接推送受保护分支 $current_branch,请提交PR/MR后合并" exit 1 fi done exit 0- 给钩子文件加执行权限:
chmod +x ~/.git-templates/hooks/pre-push- 存量本地仓库要应用全局钩子的话,进入对应仓库目录执行一次
git init即可,不会修改仓库现有内容。
- 单仓库生效配置:
直接进入对应仓库的.git/hooks目录,按上面的步骤创建pre-push文件加执行权限即可,不需要配置全局模板目录。
方案2:Git别名实现(轻量化,配置灵活)
如果不想修改钩子,也可以通过自定义Git别名实现推送前校验,适合快速配置的场景。
- 执行以下命令配置全局别名,用
safe-push代替原生push命令:
git config --global alias.safe-push '!f() { # 自定义受保护分支列表 PROTECTED_BRANCHES="master main prod" current_branch=$(git rev-parse --abbrev-ref HEAD) if [[ " $PROTECTED_BRANCHES " =~ " $current_branch " ]]; then echo "[错误] 禁止推送到受保护分支 $current_branch" exit 1 fi git push "$@" }; f'
- 后续日常推送直接执行
git safe-push即可触发校验,如果你想完全替换原生git push的行为,把上面命令中的safe-push改成push即可。
临时绕过说明:如果确实需要直接推送受保护分支,方案1可以在push命令后加
--no-verify参数跳过钩子校验;方案2可以直接调用Git绝对路径推送(如/usr/bin/git push)或者临时删除对应别名。
内容的提问来源于stack exchange,提问作者CafeHey
相关产品推荐
相关产品推荐

