You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将多个独立Git仓库合并到新仓库并完整保留各自commit history?

如何将多个独立Git仓库合并到新仓库并完整保留各自commit history?

嗨,这个需求完全可以实现!我来给你一步步讲清楚怎么做,保证能完整保留两个仓库的所有提交历史,而且最终是一个统一的仓库,不用再折腾子模块那种独立维护的麻烦流程。

咱们直接上实操步骤,假设你要合并的两个旧仓库是project-1project-2,要创建的新仓库叫project

  • 先创建并初始化新的空仓库:

    mkdir project && cd project
    git init
    
  • 把两个旧仓库添加为新仓库的远程源(路径可以是本地仓库的绝对路径,也可以是远程Git服务器的URL,比如git@github.com:xxx/project-1.git):

    git remote add project-1 /path/to/your/existing/project-1
    git remote add project-2 /path/to/your/existing/project-2
    
  • 拉取两个旧仓库的所有分支和完整提交历史:

    git fetch project-1
    git fetch project-2
    
  • 处理project-1的历史,把它的所有文件统一迁移到新仓库的project-1子目录下(这一步是为了避免合并时文件冲突,同时让历史记录对应到正确的目录):
    首先切换到project-1的主分支(如果你的分支名是master就换成master):

    git checkout project-1/main
    

    然后用git filter-repo工具重写提交历史,把所有文件移动到project-1目录:

    git filter-repo --to-subdirectory-filter project-1
    

    小提示:如果你的Git版本没有自带git filter-repo,需要先安装它。Mac可以用brew install git-filter-repo,Ubuntu用apt-get install git-filter-repo,Windows可以通过pip install git-filter-repo安装。

  • 用同样的方法处理project-2的历史:
    先切回新仓库的主分支:

    git checkout main
    

    再切换到project-2的主分支:

    git checkout project-2/main
    

    执行目录迁移的历史重写:

    git filter-repo --to-subdirectory-filter project-2
    
  • 现在把处理好的两个分支合并到新仓库的主分支:
    切回主分支:

    git checkout main
    

    合并project-1的分支(--allow-unrelated-histories必须加,因为两个仓库原本没有共同提交祖先):

    git merge --allow-unrelated-histories project-1/main
    

    再合并project-2的分支:

    git merge --allow-unrelated-histories project-2/main
    
  • 最后清理掉临时添加的远程源,就可以把新仓库推到你的远程Git服务器了:

    git remote remove project-1
    git remote remove project-2
    # 添加你的远程仓库地址并推送
    git remote add origin git@your-git-server/your-username/project.git
    git push -u origin main
    

操作完成后,你可以通过git log --oneline -- project-1单独查看project-1的所有提交历史,project-2的历史也可以用同样的方式查看,所有历史记录都完整保留着,而且整个项目已经是一个统一的仓库,完全符合你们要合并成一个产品的需求,不用再维护子模块的关联啦。

备注:内容来源于stack exchange,提问作者Yorgos S.

火山引擎 最新活动