如何在Azure DevOps中默认禁止所有仓库main分支强制推送,保留普通推送权限
解决方案:Azure DevOps项目级批量配置main分支禁止强制推送
可以实现你的需求,核心是通过项目级分支权限模板批量配置现有仓库,并让新建仓库自动继承规则,同时不启用分支保护策略(保留直接推送main的权限)。具体步骤如下:
1. 调整项目级全局权限
首先确保团队在项目层面拥有所有分支的强制推送权限,之后单独覆盖main分支的规则:
- 进入项目设置 → 权限 → 找到你的团队用户组
- 在「Git仓库」权限分类中,将**强制推送(所有分支)**设置为「允许」,确保除main外的分支默认能自由强制推送
- 其他核心权限(如「推送」)保持「允许」,满足直接提交main分支的需求
2. 创建项目级分支权限模板(自动应用到新建仓库)
这个模板会让所有新建仓库的main分支自动禁用强制推送:
- 进入项目设置 → 仓库 → 分支权限模板 → 点击「新建模板」
- 模板名称设为「Main分支禁止强制推送」,分支模式填写
refs/heads/main(匹配所有仓库的main分支) - 在权限设置中找到你的团队组,将强制推送权限设为「拒绝」,其余权限保持默认
- 保存后,将该模板设置为项目的默认分支权限模板,后续新建仓库会自动套用此规则
3. 批量更新现有仓库的main分支权限
用Azure DevOps CLI批量处理现有仓库,避免手动逐个配置:
- 先登录Azure DevOps CLI:
az devops login - 运行以下脚本遍历项目下所有仓库,批量设置main分支的强制推送拒绝权限:
注:权限ID 12对应「强制推送」权限,可通过# 替换为你的项目名称和团队组名称 PROJECT_NAME="你的项目名" TEAM_GROUP="你的团队组名" az repos list --project "$PROJECT_NAME" --query "[].name" -o tsv | while read REPO_NAME; do az repos permission update \ --project "$PROJECT_NAME" \ --repository "$REPO_NAME" \ --branch main \ --group "$TEAM_GROUP" \ --permission-id 12 \ --deny doneaz repos permission list --permission-name "Force push"确认
4. 验证配置效果
- 测试强制推送main分支:执行
git push --force origin main会被权限拒绝 - 测试常规推送main分支:直接
git push origin main可以正常提交(如README修改) - 测试特性分支强制推送:在任意非main分支执行
git push --force origin feature/xxx可成功 - 测试新建仓库:创建新仓库后,查看main分支权限,确认强制推送已被拒绝
内容的提问来源于stack exchange,提问作者Cristian Sanchez
相关产品推荐
相关产品推荐

