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

Azure DevOps源码迁移至GitLab:如何同步合并请求历史?

迁移Azure DevOps代码及PR/MR历史到GitLab的方案

1. 专用迁移工具

  • GitLab官方Azure DevOps迁移工具:GitLab原生支持从Azure DevOps导入仓库,可同步代码提交历史、分支、标签,以及Pull Request的评论、状态、合并记录。直接在GitLab项目的导入页面选择Azure DevOps源,配置双方的访问令牌(Azure DevOps PAT、GitLab个人令牌)即可触发迁移,无需手动编写核心逻辑。
  • 自定义脚本+API组合:如果需要更精细化的迁移控制,可结合Azure DevOps和GitLab的REST API自行实现PR/MR历史的同步。

2. 分步迁移流程

第一步:同步代码及提交历史

用原生Git命令完成仓库镜像,确保所有分支、标签、提交记录完整迁移:

# 克隆Azure DevOps仓库(包含所有分支和标签的镜像版本)
git clone --mirror https://dev.azure.com/[组织名]/[项目名]/_git/[仓库名]
cd [仓库名].git
# 推送到GitLab目标仓库
git push --mirror https://gitlab.com/[用户名]/[仓库名].git

第二步:迁移PR/MR历史

通过API抓取Azure DevOps的PR数据,转换成GitLab MR格式并导入:

核心逻辑(Python伪代码示例)

import requests

# Azure DevOps配置
AZURE_PAT = "你的Azure DevOps个人访问令牌"
AZURE_ORG = "组织名称"
AZURE_PROJ = "项目名称"
AZURE_REPO_ID = "仓库ID"

# GitLab配置
GITLAB_TOKEN = "你的GitLab个人令牌"
GITLAB_PROJECT_ID = "GitLab项目ID"

# 获取Azure DevOps所有PR列表
azure_pr_api = f"https://dev.azure.com/{AZURE_ORG}/{AZURE_PROJ}/_apis/git/repositories/{AZURE_REPO_ID}/pullrequests?api-version=7.1-preview.1"
headers_azure = {"Authorization": f"Basic {AZURE_PAT}"}
pr_list = requests.get(azure_pr_api, headers=headers_azure).json()["value"]

# 遍历PR创建GitLab MR并导入评论
for pr in pr_list:
    # 创建GitLab MR
    mr_payload = {
        "source_branch": pr["sourceRefName"].replace("refs/heads/", ""),
        "target_branch": pr["targetRefName"].replace("refs/heads/", ""),
        "title": pr["title"],
        "description": pr["description"] or "无描述"
    }
    gitlab_mr_api = f"https://gitlab.com/api/v4/projects/{GITLAB_PROJECT_ID}/merge_requests"
    headers_gitlab = {"PRIVATE-TOKEN": GITLAB_TOKEN}
    mr_response = requests.post(gitlab_mr_api, json=mr_payload, headers=headers_gitlab)
    mr_iid = mr_response.json()["iid"]

    # 导入PR评论
    thread_api = f"https://dev.azure.com/{AZURE_ORG}/{AZURE_PROJ}/_apis/git/repositories/{AZURE_REPO_ID}/pullrequests/{pr['pullRequestId']}/threads?api-version=7.1-preview.1"
    threads = requests.get(thread_api, headers=headers_azure).json()["value"]
    for thread in threads:
        for comment in thread["comments"]:
            note_payload = {"body": comment["content"]}
            note_api = f"https://gitlab.com/api/v4/projects/{GITLAB_PROJECT_ID}/merge_requests/{mr_iid}/notes"
            requests.post(note_api, json=note_payload, headers=headers_gitlab)

3. 关键注意事项

  • 权限配置:Azure DevOps的PAT需要代码读取、Pull Request读取权限;GitLab令牌需要项目写入、合并请求创建权限。
  • 测试验证:迁移前先在测试环境完成全流程验证,避免影响生产仓库数据。
  • 格式兼容:Azure DevOps的PR附件、特殊格式评论需额外处理转换,确保在GitLab中正常显示。
  • 状态同步:已合并的PR会在GitLab中标记为合并状态,未合并的PR将保留为开放MR。

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:06:08