github上需在settings→branches→branch protection rules中添加main分支规则,并勾选“include administrators”“prevent force pushes”和“prevent branch deletion”三项,缺一不可,才能确保远端强制生效。

GitHub 上怎么让 main 分支不能被删也不能被 force push?
直接生效的配置在远端,不是本地 git config 或 hook 能拦住的。进仓库 Settings → Branches → Branch protection rules,点 Add rule,填 main(或 master)后必须勾选三项:
-
Include administrators:否则你自己作为 Admin 能绕过所有规则 -
Prevent force pushes:关掉Allow force push选项(GitLab 默认 15.0+ 关闭,但自建实例常开着) -
Include administrators和Prevent branch deletion:这两项要同时开,缺一不可
只开 Require pull request reviews before merging 不顶用——它不防删、不防强推,只管合并路径。
GitLab 里 Developer 角色为什么还能 push 到 protected master?
因为 GitLab 的权限是双轨制:Allowed to merge 和 Allowed to push 独立配置。很多人只改了前者,忘了清空后者。
正确操作路径:Settings → Repository → Protected branches → 找到 master 行 → 展开 Allowed to push 列 → 把 Developer 权限彻底移除(留空或只保留 Maintainer)。
顺带验证下 API 返回值里的 "allow_force_push": false 和 "push_access_levels" 是否真为 [{"access_level": 40}](40 = Maintainer)。
误删了 GitLab 的 main 分支,还有救吗?
有,但得快。GitLab 删除分支只是软删,默认保留 30 天(可配),只要没执行 gitlab-rake gitlab:cleanup:orphaned_branches 就能恢复。
批量替换指定目录下所有 Git 仓库的远程地址(remote URL)。 当用户需要将 Git 仓库从一个服务器迁移到另一个服务器时使用。 触发词:git remote 替换、git url 批量修改、git 仓库迁移、更换 git 地址、批量修改 remote url。
三种恢复方式按优先级排列:
- 管理员后台直接还原:Admin Area → Overview → Projects → 找到项目 → Settings → General → Expand “Advanced” →
Restore branch(按钮名可能叫Recover branch) - 从最近一次推送的 reflog 恢复:用
git ls-remote origin查看远端引用,找到refs/heads/main对应的 commit hash,再git push origin <hash>:main</hash> - 靠备份恢复:如果启用了 GitLab Geo 或定期
git bundle备份,从备份中提取refs/heads/main再推回
注意:本地 git branch -D main 不影响远端,真正危险的是 git push origin :main 这种删除远端引用的操作。
CODEOWNERS + 分支保护一起用时为什么 PR 还能被非负责人 approve?
因为 CODEOWNERS 文件本身不触发强制审批,它只是标记“谁该审”,真正起作用的是分支保护规则里是否勾了 Require approval from code owners(GitLab)或 Require code owner review(GitHub)。
常见漏点:
- CODEOWNERS 文件没提交到受保护分支(比如只在 feature 分支里加了,但 main 里没有)
- 路径匹配写错,比如写了
/src/**但实际修改在src/utils/,漏掉开头斜杠导致不生效 - GitLab 里没在 Protected branches 页面勾选
Require approval from code owners,这个开关默认是关的
验证方法:提一个改了 CODEOWNERS 里指定路径的 MR,看 UI 是否自动 @ 对应 owner,且 Approve 按钮灰掉直到他点 approve。










