You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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项目为独立仓库

  1. 进入原pet-shop仓库目录:
    cd pet-shop
    
  2. 使用git filter-repo提取web项目的所有提交历史(这个工具是Git官方推荐替代旧的filter-branch的工具,更安全高效):
    git filter-repo --path web --path-rename web/:
    
    这个命令会做两件事:一是只保留和web文件夹相关的所有提交,二是把web目录下的所有文件移到仓库根目录(这样拆分后的Web项目结构更合理,不用嵌套在web文件夹里)。
  3. 现在这个仓库就只剩Web项目的纯净历史了,把它推到新的远程仓库:
    git remote add origin <你的Web项目新远程仓库地址>
    git push -u origin main
    

第三步:拆分Rest-API项目为独立仓库

回到之前备份的原仓库(或者重新克隆一份原pet-shop仓库,避免和Web拆分操作互相干扰):

  1. 进入备份的仓库目录:
    cd pet-shop-backup
    
  2. 同样用git filter-repo提取API项目的历史:
    git filter-repo --path rest-api --path-rename rest-api/:
    
  3. 推到新的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:52:06