如何在Git父仓库中包含Git子模块及其物理文件?
拆分单Git仓库为独立子仓库的解决方案
我太懂这种痛点了——把两个完全独立的项目塞进同一个Git仓库,提交记录混得一塌糊涂,Web开发的同事刷commit历史全是Python API的修改,API开发的又要跳过一堆Angular的变更,完全没必要。下面给你一套靠谱的拆分方案,把web和rest-api拆成两个独立的Git仓库,各自保留自己的完整提交历史:
第一步:备份原仓库(重中之重!)
不管操作多熟练,先给原pet-shop仓库做个完整备份,避免操作失误丢数据。最简单的方式是直接复制整个仓库文件夹,或者用镜像克隆:
git clone --mirror <原pet-shop仓库地址> pet-shop-backup
第二步:拆分Web项目为独立仓库
- 进入原
pet-shop仓库目录:cd pet-shop - 使用
git filter-repo提取web项目的所有提交历史(这个工具是Git官方推荐替代旧的filter-branch的工具,更安全高效):
这个命令会做两件事:一是只保留和git filter-repo --path web --path-rename web/:web文件夹相关的所有提交,二是把web目录下的所有文件移到仓库根目录(这样拆分后的Web项目结构更合理,不用嵌套在web文件夹里)。 - 现在这个仓库就只剩Web项目的纯净历史了,把它推到新的远程仓库:
git remote add origin <你的Web项目新远程仓库地址> git push -u origin main
第三步:拆分Rest-API项目为独立仓库
回到之前备份的原仓库(或者重新克隆一份原pet-shop仓库,避免和Web拆分操作互相干扰):
- 进入备份的仓库目录:
cd pet-shop-backup - 同样用
git filter-repo提取API项目的历史:git filter-repo --path rest-api --path-rename rest-api/: - 推到新的API项目远程仓库:
git remote add origin <你的API项目新远程仓库地址> git push -u origin main
后续注意事项&协作建议
- 提前和团队同步拆分计划,让所有人停止向原
pet-shop仓库提交代码,拆分完成后切换到各自的新仓库工作。 git filter-repo会重写提交历史,所以拆分后的仓库提交哈希和原仓库完全不同,不要把拆分后的仓库推回原远程仓库,避免污染历史。- 如果原仓库有多个分支(比如develop、feature分支),需要在
filter-repo命令里加上--refs参数指定要处理的分支,比如:git filter-repo --path web --refs main develop feature/web-login - 如果之后还需要把两个项目放在一起管理,可以考虑用Git Submodule或者Git Subtree把两个独立仓库整合到一个父仓库,但一般来说,独立仓库更适合各自的开发流程。
内容的提问来源于stack exchange,提问作者ske
相关产品推荐
相关产品推荐

