迁移GHES至GHEC:如何在本地镜像仓库编辑分支保护规则?
解决GHES到GHEC迁移中的分支保护与分支重命名问题
核心认知:分支保护规则不在Git镜像仓库里
分支保护规则是GitHub平台的仓库级配置,不属于Git仓库本身的版本控制数据(比如分支、提交、标签这些)。git clone --mirror只会克隆Git层面的内容,所以本地镜像仓库里根本找不到分支保护规则的存储位置——它原本就不在那里。
一、迁移分支保护规则的正确方式
方法1:用GitHub API批量迁移
- 先导出GHES上目标仓库的分支保护配置(以master分支为例):
# 先登录GHES的gh cli gh auth login --hostname YOUR_GHES_DOMAIN # 导出master分支的保护规则到json文件 gh api repos/OWNER/REPO/branches/master/protection > branch-protection.json - 再将配置导入到GHEC的目标仓库(如果已经重命名分支为main,就替换分支名):
# 登录GHEC的gh cli gh auth login # 导入配置到main分支 gh api -X PUT repos/OWNER/REPO/branches/main/protection -f @branch-protection.json
方法2:用GitHub Enterprise Importer(GEI)
官方提供的GEI工具可以一站式迁移仓库,包括分支保护、权限、webhook等所有平台级配置,比手动用API更省心,适合单仓库或批量迁移。操作逻辑是:
- 在GHEC端发起迁移,选择GHES作为源,按向导完成配置,工具会自动同步所有分支保护规则到目标仓库。
二、安全重命名master为main并避免报错
直接在裸镜像仓库重命名分支触发删除报错,是因为分支保护规则限制了分支删除。按以下步骤操作:
- 将裸镜像仓库转为普通仓库(方便操作):
git clone --mirror YOUR_GHES_REPO_URL temp-repo cd temp-repo git config --bool core.bare false git checkout master - 重命名分支并推送至GHEC:
git branch -m master main # 添加GHEC仓库作为远程 git remote add ghec YOUR_GHEC_REPO_URL # 推送main分支 git push ghec main:main - 处理GHEC端的分支保护与默认分支:
- 在GHEC仓库设置中,将默认分支改为
main - 给
main分支配置好分支保护规则(用上面的API或GEI方法) - 取消
master分支的保护规则(如果之前推送了master的话)
- 在GHEC仓库设置中,将默认分支改为
- 删除GHEC端的master分支(可选):
git push ghec --delete master - 如果需要保持镜像同步:回到裸镜像仓库,执行
git branch -m master main,再重新git push --mirror GHEC_URL,此时推送的就是main分支而非master。
内容的提问来源于stack exchange,提问作者Underoos
相关产品推荐
相关产品推荐

