如何将多个独立Git仓库合并到新仓库并完整保留各自commit history?
嗨,这个需求完全可以实现!我来给你一步步讲清楚怎么做,保证能完整保留两个仓库的所有提交历史,而且最终是一个统一的仓库,不用再折腾子模块那种独立维护的麻烦流程。
咱们直接上实操步骤,假设你要合并的两个旧仓库是project-1和project-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.




