带历史记录的旧Git仓库变更迁移至新Git仓库方案咨询
SVN转Git后跨Git仓库带历史迁移解决方案
核心需求梳理
需要将包含完整SVN转Git历史+后续新变更的旧Git仓库内容,迁移到master分支受保护、且仅保留截断后历史的新Git仓库中。优先推荐方案1(直接迁移旧Git完整历史),操作更简便。
方案1:直接迁移旧Git仓库完整历史+新变更
正确操作步骤
拉取旧Git仓库的完整本地副本
执行git clone --mirror <旧Git仓库URL>,该命令会克隆旧仓库的所有分支、标签、完整提交历史(包括最初从SVN迁移过来的部分),生成一个镜像副本。在本地合并新Git仓库的现有内容与旧Git完整历史
- 克隆新Git仓库到本地:
git clone <新Git仓库URL> new-git-local - 进入本地新Git目录:
cd new-git-local - 添加旧Git为远程仓库:
git remote add old-git <旧Git仓库URL> - 拉取旧Git的所有历史数据:
git fetch old-git - 创建迁移专用分支:
git checkout -b migrate-full-history - 合并旧Git的master分支到当前迁移分支(允许不相关历史合并):
git merge old-git/master --allow-unrelated-histories - 手动解决合并过程中出现的冲突(若新Git仓库在截断历史后有独立变更)
- 推送迁移分支到新Git仓库:
git push origin migrate-full-history
- 克隆新Git仓库到本地:
通过MR合并到受保护的master分支
- 在新Git仓库的平台界面(如GitLab/GitHub),创建从
migrate-full-history到master的合并请求(MR)。 - 若平台受保护分支限制了历史重写,需联系管理员临时开启相关权限(如允许合并不相关历史、允许强制推送),完成合并后再恢复权限。
- 在新Git仓库的平台界面(如GitLab/GitHub),创建从
针对你提出的问题解答
git clone --mirror能否获取旧Git的所有变更及历史?
可以,该命令会完整克隆旧仓库的所有分支、标签、提交历史,包括SVN转Git的初始历史和后续新变更。但注意:此命令是在本地克隆旧仓库的镜像,不是在新Git仓库的分支上执行的操作。能否通过MR合并/覆盖包含历史及新变更的内容?
可以,但需先通过本地git merge --allow-unrelated-histories处理新旧仓库历史不连续的问题,再推送迁移分支创建MR。直接创建MR会因历史无关联而合并失败。是否需要创建新分支,还是直接在master分支执行操作?
必须创建新的迁移分支。原因:新Git的master分支受保护,无法直接推送或修改;且直接在master分支合并不相关历史会破坏现有分支结构,通过迁移分支可以先验证合并结果,再安全合并到master。
方案2(备选):从SVN迁移完整历史+新变更,再合并旧Git新变更
此方案操作更繁琐,仅在旧Git仓库不可用的情况下选择:
- 重新从SVN仓库克隆完整历史到本地:
git svn clone --stdlayout <SVN仓库URL> - 添加旧Git为远程仓库,拉取其后续新变更并合并到本地SVN迁移仓库
- 推送合并后的分支到新Git的迁移分支,再通过MR合并到master
内容的提问来源于stack exchange,提问作者user1971376
相关产品推荐
相关产品推荐

