使用git clone --mirror迁移仓库时如何复制Pull-Requests等资源
跨Git托管平台的仓库全量迁移实现方案
纯Git命令的能力边界
你目前使用的git clone --mirror配合git push --mirror迁移流程,本质上只操作.git目录下的Git原生仓库对象,这套流程能100%完整复制代码、全部分支、标签、提交历史、提交关联的签名信息,但完全无法覆盖托管平台在上层叠加的业务数据。
别想着靠git本身把这些功能迁走——Pull Request、嵌入标签的Releases、Web Hooks、Issues、仓库Insights这类内容,根本不存放在原生Git仓库的文件结构里,从设计之初这些就是托管平台(GitHub、GitLab、Gitea这类)自己在上层加的协作功能,和Git原生逻辑完全无关,靠纯git命令永远不可能迁移成功。
可实现全量业务数据迁移的路径
不存在脱离托管平台的通用一键迁移方案,需要根据两台服务器使用的Git托管系统对应匹配方法:
1. 两边使用同版本同系列托管平台的场景
直接使用平台自带的官方仓库迁移导入功能,不要走纯git push的流程:
- 这类官方内置的导入能力,会在传输原生仓库数据的同时,自动同步所有上层业务数据:包括全量PR的评审记录、Issue的评论/标签/人员指派关系、关联在标签上的Releases附件与版本说明、Web Hooks的配置参数
- 操作时不要提前在目标服务器创建空仓库,直接在源平台选择导出完整仓库数据包,上传到目标平台的导入入口即可,避免因为空仓库的已有元数据和导入数据包冲突,导致部分内容丢失
2. 两边使用不同托管平台的场景
需要通过平台开放的API做分模块定向同步:
- 第一步先通过现有mirror命令流程,把Git原生的代码、分支、标签、提交历史推送到目标仓库
- 第二步分别拉取源平台的Issues、PR列表、关联评论数据,通过目标平台的开放API逐条写入,尽量保留原作者、创建时间、评论链路的对应关系
- 第三步同步源平台关联在标签上的Releases资源,包括版本说明、上传的附件内容
- 最后把源平台配置的所有Web Hooks参数(触发事件规则、回调地址、校验密钥),手动配置到目标仓库的Hooks设置中
关于Insights数据的迁移说明
仓库Insights是托管平台基于长期的协作操作、代码提交记录实时计算生成的统计数据,不存在可以直接完整复制的迁移通道:哪怕使用官方的仓库导入功能,迁移完成后的Insights数据也是从新仓库接收到第一条有效数据开始重新计算,无法将源服务器上沉淀的历史统计曲线、分时段贡献度数据原封不动搬运过来。

内容的提问来源于stack exchange,提问作者Abbeyzak
相关产品推荐
相关产品推荐

