【repo】使用repo进行多仓开发的基本流程

在日常开发中,使用 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 命令

  1. 进入对应的子仓库目录编写代码。
  2. 运行 repo statusrepo 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>
相关推荐
Y幽谷客5 小时前
Python加载本地大模型(Qwen3.5 8B)
python·大模型
Wang's Blog5 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
伞伞悦读6 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
线上放牧人6 小时前
Windows删除图标缓存
windows·python·pyqt
qq_5470261797 小时前
Python 变量和简单数据类型
python
bosins7 小时前
WSL2 启动即崩溃?调整超时参数解决 Docker 阻塞问题
linux·docker·wsl
web守墓人8 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
智搜广告8 小时前
智搜广告:科技行业AI回答优化公司如何破局
大数据·python·elasticsearch·geo
kuroomi8 小时前
Ingress-Nginx与kubernetes 网络
linux·运维·网络·kubernetes
EasyGBS8 小时前
终结训推割裂!EasyGBS×EasyAIS×DLTM,实现AI算法训推一体闭环落地!
服务器·深度学习·安全