如何使用Azure DevOps与GitHub API实现权限从Azure DevOps到GitHub的迁移
借助Azure DevOps和GitHub API完成权限迁移操作指南
一、前期准备
- 拿到Azure DevOps的个人访问令牌(PAT):权限范围至少要包含组织读取、项目读取、身份读取,否则无法拉取完整的权限数据
- 拿到GitHub的个人访问令牌(PAT):组织级迁移需要repo、admin:org权限;仓库级迁移仅需repo权限,可按需调整
- 明确迁移范围:是整组织权限、特定项目/仓库权限,还是指定团队的权限映射,避免无目标操作
二、导出Azure DevOps权限数据
1. 拉取基础身份与权限配置信息
先获取组织内所有用户和团队的身份数据:
GET https://vssps.dev.azure.com/{你的组织名}/_apis/graph/users?api-version=7.1-preview.1
再获取权限命名空间(找到对应场景的权限ID,比如Git仓库、项目管理类的权限ID):
GET https://dev.azure.com/{你的组织名}/_apis/securitynamespaces?api-version=7.1-preview.1
2. 拉取具体权限条目
- 组织级权限:使用上述拿到的命名空间ID,调用接口拉取权限条目:
GET https://dev.azure.com/{你的组织名}/_apis/securityacl/namespaces/{namespaceId}/aces?api-version=7.1-preview.1
- 仓库级权限:先获取项目下的所有仓库列表:
GET https://dev.azure.com/{你的组织名}/{项目名}/_apis/git/repositories?api-version=7.1-preview.1
再针对每个仓库,使用Git对应的命名空间ID拉取权限:
GET https://dev.azure.com/{你的组织名}/{项目名}/_apis/securityacl/namespaces/{namespaceId}/aces?token=repoV2/{项目ID}/{仓库ID}&api-version=7.1-preview.1
3. 整理适配GitHub的数据
- 身份映射:Azure DevOps的用户标识为
aad.{guid}或msa.{guid},需对应到GitHub的用户名或邮箱(企业版可直接用Azure AD同步的邮箱匹配) - 权限转换:将Azure DevOps的细粒度权限(如Contribute、Read)转换为GitHub的角色(Owner、Maintainer、Write、Read),GitHub Enterprise用户可通过自定义权限补全细节
三、通过GitHub API导入权限
1. 先导入用户/团队到GitHub组织
- 邀请用户:若目标用户不在GitHub组织内,调用接口发送邀请:
POST https://api.github.com/orgs/{你的GitHub组织名}/invitations
请求体需包含用户邮箱与对应角色
- 创建团队:若需迁移Azure DevOps的团队权限,先创建对应GitHub团队:
POST https://api.github.com/orgs/{你的GitHub组织名}/teams
2. 分配仓库级权限
- 用户权限:为指定仓库添加协作人并设置权限:
PUT https://api.github.com/repos/{你的GitHub组织名}/{仓库名}/collaborators/{用户名}
请求体的permission参数填push(对应Write)、pull(对应Read)、admin(对应Owner)
- 团队权限:为团队分配指定仓库的权限:
PUT https://api.github.com/orgs/{你的GitHub组织名}/teams/{团队slug}/repos/{你的GitHub组织名}/{仓库名}
同样通过permission参数设置权限等级
3. 分配组织级权限
- 用户组织角色:调整用户在GitHub组织内的角色:
PUT https://api.github.com/orgs/{你的GitHub组织名}/members/{用户名}
role参数填admin(Owner)或member(普通成员)
- 团队组织权限:若需给团队设置组织级权限(如创建仓库),通过团队配置接口调整对应权限
四、验证与补漏
- 权限核对:调用GitHub API拉取已分配的权限,与Azure DevOps原始数据对比,确保无遗漏
- 特殊权限处理:Azure DevOps的分支权限(如强制审批)需对应到GitHub的分支保护规则,调用接口配置:
POST https://api.github.com/repos/{你的GitHub组织名}/{仓库名}/branches/{分支名}/protection
- 拒绝权限替代:GitHub无直接拒绝权限,可通过排除用户/团队、配置分支保护或仓库权限限制实现类似效果
注意事项
- 权限非完全一一对应:Azure DevOps的部分细粒度权限,GitHub只能通过角色或自定义权限近似替代,需根据业务需求调整
- 注意API速率限制:Azure DevOps每分钟最多1000次请求,GitHub每小时最多5000次(个人令牌),批量操作时需添加延时或分批次执行
- 先测试再正式迁移:建议在测试组织/仓库完成迁移验证后,再操作生产环境
内容的提问来源于stack exchange,提问作者user10434309
相关产品推荐
相关产品推荐

