如何将前后端独立Git仓库迁移至公共仓库作为子模块?
把两个独立的前后端仓库作为子模块整合到一个公共仓库里,既能统一管理项目结构,又能保留各自仓库的完整版本历史和独立开发流程,非常适合你的需求。下面是具体的操作步骤和注意事项:
一、操作步骤
创建公共父仓库
先在Git平台上新建一个空的公共仓库(比如命名为project-monorepo),然后克隆到本地:git clone git@your-repo-url/project-monorepo.git cd project-monorepo添加前后端子模块
在父仓库目录下,分别把前端和后端仓库作为子模块添加到指定目录:# 添加前端仓库作为子模块,存放在frontend目录 git submodule add git@your-repo-url/frontend.git frontend # 添加后端仓库作为子模块,存放在backend目录 git submodule add git@your-repo-url/backend.git backend执行完成后,父仓库会自动生成
.gitmodules文件,记录子模块的关联信息,同时frontend和backend目录会拉取对应仓库的代码。提交并推送父仓库变更
把新增的子模块配置和目录提交到父仓库:git add .gitmodules frontend backend git commit -m "Add frontend and backend as submodules" git push origin main
二、后续维护注意事项
克隆带子模块的父仓库:其他团队成员克隆这个公共仓库时,需要加上
--recurse-submodules参数,才能同时拉取子模块的代码:git clone --recurse-submodules git@your-repo-url/project-monorepo.git如果已经克隆了父仓库,也可以手动初始化并更新子模块:
git submodule init git submodule update子模块的独立开发:在
frontend或backend目录内,你依然可以像之前一样直接提交、推送代码到各自的原始仓库。父仓库只会记录子模块当前的提交哈希值,当子模块有更新时,需要回到父仓库提交新的哈希值,同步版本信息:cd frontend git pull origin main cd .. git add frontend git commit -m "Update frontend to latest version" git push子模块的版本锁定:父仓库默认会锁定子模块的特定提交,这能保证所有成员拉取的子模块版本一致,避免意外的版本差异。如果需要切换子模块的分支,直接在子模块目录内切换分支后,提交父仓库的变更即可。
三、可选替代方案
如果你觉得子模块的操作流程有点繁琐,也可以考虑使用Git子树(git subtree),它能把其他仓库的代码直接合并到父仓库的指定目录下,不需要额外的.gitmodules文件,但子模块的独立性会稍弱一些。不过就你的需求而言,子模块是更贴合场景的选择。
内容的提问来源于stack exchange,提问作者preneond

