如何合并两个Git仓库到单仓子目录并保留完整提交历史
合仓需求可行性结论
保留两个原有仓库的全部Git提交历史完全可实现,采用Git原生的subtree能力完成迁移,不会丢失任何提交记录、作者信息、提交时间、分支标签数据,最终效果就是在新仓库的子目录下,依然可以追溯对应项目从初始化到合仓前的所有变更记录。
你提到的全栈团队用单仓(Monorepo)管理前后端代码是非常成熟的实践,确实可以简化跨端PR的关联流程,避免前后端依赖代码合入不同步的问题。
标准操作流程
操作前建议先给两个旧仓库打全量备份,避免误操作影响原有代码资产。
- 本地初始化新的webapp空仓库
mkdir webapp && cd webapp git init
- 关联两个旧仓库作为远程源,拉取全量仓库数据
# 关联PHP/Laravel后端仓库repo1 git remote add repo1 <repo1的本地存储路径/远程仓库地址> git fetch repo1 # 关联Vue/TypeScript前端仓库repo2 git remote add repo2 <repo2的本地存储路径/远程仓库地址> git fetch repo2
- 按目录拆分迁移两个旧仓库的代码,自动保留全量历史
这一步用git subtree是目前最稳妥的无侵入方案,会自动把旧仓库根目录的所有文件映射到新仓库的对应子目录下,同时完整保留提交链路:
# 将repo1默认分支(通常为main/master)的全部内容迁移到backend子目录 git subtree add --prefix=backend repo1 <repo1的默认分支名> # 将repo2默认分支的全部内容迁移到frontend子目录 git subtree add --prefix=frontend repo2 <repo2的默认分支名>
- 迁移校验与收尾
- 进入backend、frontend目录分别检查文件完整性,随机调取早期提交执行
git log验证,确认提交信息完整、路径映射正确 - 在新仓库根目录补充全局README、统一的CI/CD配置、根级.gitignore规则,适配单仓开发流程
- 关联webapp对应的新远程仓库地址,将全量分支、标签推送至远程即可完成迁移
git remote add origin <webapp新仓库的远程地址> git push origin --all git push origin --tags
后续维护提示
- 合仓完成后建议将两个旧仓库设置为归档只读状态,避免团队成员误向旧仓库提交代码导致版本不同步
- 如果旧仓库存在需要保留的非默认分支、版本标签,在fetch拉取全量引用后,用相同的subtree逻辑对应处理即可,不会出现历史丢失
- 合仓后的首次仓库提交建议附上明确的迁移说明,同步告知所有团队成员后续代码统一提交到新仓库,旧仓库停止维护
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

