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

如何在本地设置类似Github的分支保护,避免误推代码到master分支?

本地Git分支推送防护实现方案

方案1:pre-push钩子实现(最稳定,支持全局/单仓库配置)

pre-push是Git原生提供的推送前触发的钩子,拦截逻辑不依赖个人使用习惯,防护不会失效。

  • 全局生效配置(对所有本地仓库生效):
    1. 先创建全局钩子模板目录:
    mkdir -p ~/.git-templates/hooks
    git config --global init.templatedir '~/.git-templates'
    
    1. 在~/.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
    
    1. 给钩子文件加执行权限:
    chmod +x ~/.git-templates/hooks/pre-push
    
    1. 存量本地仓库要应用全局钩子的话,进入对应仓库目录执行一次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:48:04