在日常开发中,使用 Repo 管理多仓库项目时,整体流程可以总结为 6 个标准步骤:
[1. 初始化环境] ➔ [2. 创建开发分支] ➔ [3. 编写代码/提交] ➔ [4. 同步最新变更] ➔ [5. 冲突处理/审查] ➔ [6. 清理分支]
下面是完整的标准开发流程及命令:
第一步:初始化与拉取项目代码
在开始开发前,需要先下载 Manifest 清单文件并全量拉取所有子仓库。
bash
# 1. 创建项目工作目录
mkdir my-project && cd my-project
# 2. 初始化 Repo 工作区(关联清单仓及指定分支)
repo init -u <manifest_repo_url> -b <branch_name>
# 3. 多线程并行同步所有子仓库代码
repo sync -j8
第二步:创建本地开发分支(核心步骤)
刚拉取下来的代码各个子仓库处于"游离头指针(Detached HEAD)"状态。在进行任何代码修改前,必须先创建本地分支!
bash
# 语法:repo start <本地分支名> [--all | <指定仓库相对路径>]
# 方式 A:为所有子仓库统一切出一个名为 feature/login 的分支
repo start feature/login --all
# 方式 B:仅给与本次需求相关的子仓库切出分支(推荐,避免无关仓库产生冗余分支)
repo start feature/login services/auth apps/web
第三步:在子仓库中编写代码与提交
Repo 只负责多仓的调度,单个仓库内部的代码提交依然使用原生 Git 命令。
- 进入对应的子仓库目录编写代码。
- 运行
repo status或repo diff确认全局改动情况。
bash
# 进入特定的子仓库
cd services/auth
# 标准 Git 提交流程
git add .
git commit -m "feat(auth): add OAuth2 login support"
第四步:同步上游主干最新代码
开发过程中或提交前,需要拉取团队上游(如 main 分支)的最新代码,避免代码落后过多。
bash
# 返回项目根目录
cd /path/to/my-project
# 同步上游最新代码(Repo 会自动在各个子仓库执行 rebase 或 merge)
repo sync -j8
第五步:推送到远程与代码评审(Code Review)
完成本地开发与测试后,将代码推送至远程进行 Code Review 或合并。
情况 A:使用 Gerrit 评审系统(Repo 原生支持)
如果团队使用 Gerrit 做代码审查,可以直接通过 Repo 批量上传:
bash
# 批量将改动上传至 Gerrit 评审平台
repo upload
情况 B:使用 GitHub / GitLab / Gitee 等平台
如果使用 Merge Request (MR) / Pull Request (PR) 模式,进入改动过的子仓库,手动推送到个人 Fork 仓或远程分支,然后在 Web 端提交 MR/PR:
bash
cd services/auth
git push origin feature/login
第六步:清理与收尾工作
当你的 MR/PR 被审核通过并合并入主干后,清理本地已经完成使命的分支,保持工作区整洁。
bash
# 1. 再次同步最新的主干代码
repo sync -j8
# 2. 安全删除已合并的本地分支
repo prune
💡 极简开发流程速记
bash
repo start <feature_name> <path> # 1. 领任务:切分支
cd <path> && git commit -am "..." # 2. 干活:标准 Git 提交
repo sync # 3. 对齐:拉取最新代码
repo upload (或 git push) # 4. 交付:提交评审
repo prune # 5. 打扫:清理旧分支
特殊命令
bash
# 格式:repo forall -c '<shell命令>'
# 示例 1:查看所有子仓库当前的 git 状态
repo forall -c 'git status -s'
# 示例 2:清空所有子仓库中的未跟踪文件(慎用)
repo forall -c 'git clean -fd'
# 示例 3:只在改动过的仓库中切回 main 分支
repo forall -c 'git checkout main'
manifest示例
bash
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<!-- 1. 定义远程 Git 服务器基地址 -->
<remote name="origin"
fetch="https://github.com/my-company/"
review="https://gerrit.my-company.com" /> <!-- Gerrit 代码评审地址(可选) -->
<!-- 2. 设置默认参数:默认使用 origin 远程仓,默认跟踪 main 分支 -->
<default revision="main"
remote="origin"
sync-j="4" />
<!-- 3. 定义各个子仓库的映射关系 -->
<!-- path: 本地存放目录 | name: 远程仓库名 | revision: 可单独指定此仓分支/Tag/Commit -->
<project path="apps/web" name="frontend-web" />
<project path="services/auth" name="service-auth" revision="v1.2.0" />
<project path="libs/common" name="core-common-lib" />
</manifest>