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

如何将Gitlab免费云仓库的Issues、PR及评论导入Github免费云?

从Gitlab免费云迁移仓库到Github(含Issues/PR/评论/原始时间戳)

要完整迁移代码、Issues、Merge Requests(对应Github的PR)、评论及原始时间戳,避开你之前遇到的API限制、时间戳丢失、工具报错问题,可按以下方案操作:

一、先完成代码与版本历史迁移

直接用Git命令做镜像克隆,比Github自带导入按钮更可靠,能完整迁移分支、标签:

# 克隆Gitlab仓库的完整镜像
git clone --mirror git@gitlab.com:你的用户名/原仓库名.git
cd 原仓库名.git
# 推送到Github新仓库
git push --mirror git@github.com:你的用户名/新仓库名.git

二、迁移Issues、PR及评论(保留原始时间戳)

方案1:Gitlab导出+自定义脚本批量导入(可控性强)

Gitlab免费版支持导出项目数据为JSON(包含所有Issues、MR、评论、时间戳),配合Github API写脚本导入,可灵活处理API限流,保留原始时间:

  1. 导出Gitlab数据
    • 登录Gitlab进入目标仓库 → 设置 → 通用 → 导出项目
    • 勾选「Issues」「Merge requests」「Comments」,等待导出后下载压缩包,解压后得到issues.json、merge_requests.json、notes.json
  2. 准备Github权限
    • 创建Github个人访问令牌,勾选repo权限(需仓库写权限)
  3. 编写导入脚本
    以Python为例,核心逻辑如下(可根据需求扩展):
    import json
    import requests
    import time
    
    GITHUB_TOKEN = "你的Github个人访问令牌"
    REPO = "你的用户名/新仓库名"
    HEADERS = {"Authorization": f"token {GITHUB_TOKEN}"}
    
    # 导入Issues及评论
    with open("issues.json", "r") as f:
        issues = json.load(f)
    
    for issue in issues:
        # 创建Issue
        create_payload = {
            "title": issue["title"],
            "body": issue["description"] or "",
            "state": "open" if issue["state"] == "opened" else "closed",
            "labels": [label["title"] for label in issue["labels"]]
        }
        res = requests.post(f"https://api.github.com/repos/{REPO}/issues", json=create_payload, headers=HEADERS)
        if res.status_code != 201:
            print(f"创建Issue失败: {issue['title']}")
            continue
        github_issue_num = res.json()["number"]
    
        # 修改原始创建/更新时间
        update_payload = {
            "created_at": issue["created_at"],
            "updated_at": issue["updated_at"]
        }
        requests.patch(f"https://api.github.com/repos/{REPO}/issues/{github_issue_num}", json=update_payload, headers=HEADERS)
    
        # 导入评论
        for note in [n for n in issue["notes"] if n["noteable_type"] == "Issue"]:
            requests.post(f"https://api.github.com/repos/{REPO}/issues/{github_issue_num}/comments",
                        json={"body": note["body"], "created_at": note["created_at"]},
                        headers=HEADERS)
        time.sleep(1)  # 避免触发API限流
    
    # Merge Requests导入逻辑类似:关联已迁移的分支,创建PR并导入评论
    

方案2:正确使用Github Actions Importer(官方工具)

你之前尝试的官方Actions Importer是靠谱方案,正确操作步骤如下:

  1. 安装CLI工具:
    brew install github/gh/gh-actions-importer
    
  2. 配置迁移权限:
    gh actions-importer configure
    
    按提示输入Gitlab(需read_api权限)和Github的令牌,选择迁移类型为issues和pull_requests
  3. 测试迁移(不实际修改仓库):
    gh actions-importer dry-run issues --source-url https://gitlab.com/你的用户名/原仓库名 --target-url https://github.com/你的用户名/新仓库名
    
  4. 执行正式迁移:
    gh actions-importer migrate issues --source-url https://gitlab.com/你的用户名/原仓库名 --target-url https://github.com/你的用户名/新仓库名
    
    该工具会自动处理API限流,保留原始时间戳,支持批量迁移多个仓库。

三、你之前使用工具的问题说明

  • node-gitlab-2-github:未调用Github时间戳修改API,仅能以当前时间创建内容,且无API限流处理,效率极低,不推荐
  • github-csv-tools:CSV格式兼容性差,不支持修改时间戳,仅适合极小批量简单迁移
  • Actions Importer:之前未掌握正确CLI操作流程,按上述步骤即可正常使用

四、注意事项

  • 迁移前在Github创建空仓库,不要初始化README/许可证,避免冲突
  • 批量迁移多个仓库时,建议分批次进行,每批间隔1小时,避开API小时调用限制
  • 迁移完成后,核对Issues/PR的状态、标签、评论、时间戳是否完整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:13:39