使用Git Submodules + Worktree 的组合来实现多仓库管理。新建一个“管理仓库”,通过它来统一操作多个已有的独立代码仓库,并在统一的工作流下修改它们。
架构设计
my-projects-master/ ← 你新建的“管理仓库”
├── .gitmodules ← 记录子仓库的映射关系
├── web-app/ ← 子仓库1:Web 端(独立 Git 仓库)
├── h5-app/ ← 子仓库2:H5 端(独立 Git 仓库)
└── admin-app/ ← 子仓库3:管理后台(独立 Git 仓库)
工作流程:
- 在管理仓库里创建 worktree
- worktree 里自动带出所有子仓库
- 在 worktree 里改子仓库的代码,推到各自的远程仓库
- 管理仓库只记录“这次迭代用了哪个版本的子仓库”
第一步:创建管理仓库
# 1. 创建管理仓库
mkdir ~/project/my-projects-master
cd ~/project/my-projects-master
git init
# 2. 创建初始提交
echo "# 我的项目管理仓库" > README.md
git add .
git commit -m "init: 项目管理仓库"
第二步:把已有的独立仓库加进来
# 添加 Web 端
git submodule add git@github.com:company/web-app.git web-app
# 添加 H5 端
git submodule add git@github.com:company/h5-app.git h5-app
# 添加管理后台
git submodule add git@github.com:company/admin-app.git admin-app
# 提交映射关系
git add .
git commit -m "feat: 添加子仓库映射"
# 推送到远程(需要先在 GitHub/GitLab 创建这个管理仓库)
git remote add origin git@github.com:company/my-projects-master.git
git push -u origin main
此时你的目录结构:
my-projects-master/
├── .gitmodules ← Git 自动生成
├── web-app/ ← 链接到 company/web-app.git 的 main 分支
├── h5-app/ ← 链接到 company/h5-app.git 的 main 分支
└── admin-app/ ← 链接到 company/admin-app.git 的 main 分支
第三步:基于管理仓库创建 Worktree
假设要开发一个新功能,同时涉及 Web 端和 H5 端:
cd ~/project/my-projects-master
# 基于 main 分支创建 worktree
git worktree add -b feat/new-user-flow ../master-new-flow main
# 进入 worktree
cd ../master-new-flow
# 初始化所有子仓库(关键步骤!)
git submodule update --init --recursive
现在 ~/project/master-new-flow 里有完整的三个子仓库代码。
第四步:在 Worktree 里改代码
cd ~/project/master-new-flow
# 进入 Web 端子仓库
cd web-app
# 子仓库也是独立的 Git 仓库,可以正常操作
git checkout -b feat/new-user-flow
# 改代码...
echo "// 新功能代码" >> src/index.ts
git add .
git commit -m "feat: 新用户流程"
git push origin feat/new-user-flow
# 回到管理仓库
cd ../..
# 同样的方式改 H5 端
cd h5-app
git checkout -b feat/new-user-flow
# 改代码...
git add .
git commit -m "feat: 新用户流程H5版"
git push origin feat/new-user-flow
第五步:记录子仓库版本快照
回到管理仓库,记录这次用了哪些子仓库的哪些版本:
cd ~/project/master-new-flow
# 此时 git status 会显示子仓库有新的提交引用
git status
# 输出示例:
# modified: web-app (new commits)
# modified: h5-app (new commits)
# 提交这个版本快照
git add web-app h5-app
git commit -m "feat: 新用户流程 - 更新子仓库版本"
# 推送管理仓库
git push origin feat/new-user-flow
这个 commit 的意义:它记录了“新用户流程这个需求,Web 端用的是 commit abc123,H5 端用的是 commit def456”。
第六步:清理
cd ~/project/my-projects-master
git worktree remove ../master-new-flow
完整操作速查
# ===== 首次配置 =====
git init my-projects-master && cd my-projects-master
git submodule add <仓库1地址> <目录名>
git submodule add <仓库2地址> <目录名>
git commit -m "init: 添加子仓库"
git push
# ===== 日常开发 =====
cd ~/project/my-projects-master
# 创建 worktree
git worktree add -b <功能名> ../master-<功能名> main
# 进入 worktree + 初始化子仓库
cd ../master-<功能名>
git submodule update --init --recursive
# 进入某个子仓库开发
cd <子仓库目录>
git checkout -b <功能名>
# 写代码、commit、push
# 回到管理仓库,记录版本快照
cd ../../
git add .
git commit -m "feat: <功能名> - 更新子仓库版本"
git push
# 清理
cd ~/project/my-projects-master
git worktree remove ../master-<功能名>
你可能会问
Q:子仓库能各自装不同的依赖吗?
可以。子仓库是独立的,到各自的目录里 pnpm install 就行:
cd ~/project/master-new-flow/web-app && pnpm install
cd ~/project/master-new-flow/h5-app && pnpm install
Q:如果只想改其中一个子仓库,另一个保持不动?
完全没问题。Worktree 只是给你一个统一的工作区,具体改哪个子仓库随你。
Q:管理仓库本身需要 push 吗?
看团队需求:
- 需要:大家都用这个管理仓库,共享“功能-子仓库版本”的对应关系
- 不需要:你自己用的话,管理仓库放本地就行,纯粹当启动器
实现效果
my-projects-master ← 新建的“操控面板”
└── 创建 worktree ← 一键生成完整工作区
├── web-app → 改代码 push → 原仓库接收
├── h5-app → 改代码 push → 原仓库接收
└── admin-app → 不改,保持原样
你全部的操作都在 worktree 里完成,原来的独立仓库物理位置不动,代码改动推送到它们各自的远程仓库。 管理仓库像个“遥控器”,记录你这一轮迭代改了哪些仓库、改到了哪个版本。