Repo 命令详解指南
Repo 命令详解指南
Repo 是 Google 用 Python 脚本编写的工具,用于在 Android 环境下管理多个 Git 仓库。它并不是用来取代 Git,而是为了让开发者更方便地管理多个 Git 库。
核心工作流
- 初始化 (
init): 下载 Manifest 仓库。 - 同步 (
sync): 下载所有代码仓库。 - 开发 (
start): 创建本地开发分支。 - 工作 (
git): 在具体仓库中进行 Git 操作 (add, commit)。 - 储藏 (
forall ... stash): 临时保存未提交的修改。 - 上传 (
upload): 将代码提交到 Gerrit 进行审核。
常用命令详解
1. repo init
初始化 Repo 客户端。这是开始任何工作的第一步。
用法:
repo init -u <URL> [<OPTIONS>]
常用选项:
-u URL: 指定 Manifest 仓库的 URL 地址。-b REVISION: 指定要检出的 Manifest 分支或 Revision(如master,release-1.0)。默认为master。-m NAME: 指定要使用的 Manifest 文件名。默认为default.xml。--depth=1: 浅克隆,只下载最近一次提交,用于节省空间和时间(不包含历史记录)。
示例:
# 初始化主分支
repo init -u https://android.googlesource.com/platform/manifest
# 初始化特定分支 (android-14.0.0_r1)
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1
2. repo sync
同步代码。将本地代码与服务器代码同步。相当于 Git 的 fetch + rebase (或 checkout)。
用法:
repo sync [<PROJECT_LIST>]
常用选项:
-j N: 并发数 (Jobs)。例如-j4表示开启 4 个线程下载,能显著加快速度。-c/--current-branch: 只同步当前分支。-d/--detach: 将项目检出(detach)到 Manifest 指定的版本。重要: 如果你在本地有未提交的修改或处于临时分支,这有助于恢复到干净状态。-f/--force-broken: 即使某个项目同步失败,也继续同步其他项目。--no-tags: 不下载标签,节省时间和空间。
示例:
# 同步所有项目,使用 8 个线程
repo sync -j8
# 强制将所有项目恢复到 Manifest 指定的状态 (丢弃本地未跟踪的分支)
repo sync -d
3. repo start
创建新的开发分支。Repo 建议使用此命令而不是 git checkout -b,因为它能确保分支与 Manifest 的配置关联。
用法:
repo start <BRANCH_NAME> [<PROJECT_LIST>] --all
常用选项:
--all: 在 Manifest 中的所有项目上创建该分支。.: 仅在当前目录所属的项目上创建分支。
示例:
# 在所有项目中创建名为 'feature/new-ui' 的分支
repo start feature/new-ui --all
# 仅在当前目录下创建分支
repo start fix-bug .
4. repo status
查看工作区状态。显示哪些项目有修改、哪些项目有未跟踪的文件。
用法:
repo status
输出说明:
- 第一列表示暂存区状态 (index)。
- 第二列表示工作区状态 (worktree)。
- 常见状态码:
-: 无变化M: 修改 (Modified)A: 新增 (Added)D: 删除 (Deleted)R: 重命名 (Renamed)
示例:
repo status
# 输出:
# project frameworks/base/
# -m core/java/android/app/Activity.java
5. repo upload
上传代码进行代码审查 (Code Review)。通常用于 Gerrit 系统。
用法:
repo upload [<PROJECT_LIST>]
流程:
- 运行命令后,Repo 会搜索所有项目中尚未上传的提交。
- 它会打开编辑器让你确认要上传的分支和提交。
- 确认后,代码会被推送到 Gerrit 服务器。
常用选项:
--cbr/--current-branch: 上传当前分支的修改,通常与repo upload .配合使用。--re/--reviewers: 指定审查者邮箱。
6. repo forall
在所有(或指定)仓库中执行任意 Shell 命令。这是 Repo 最强大的功能之一。
用法:
repo forall [<PROJECT_LIST>] -c <COMMAND>
常用选项:
-c: 指定要执行的 Shell 命令。-p: 在输出结果前打印项目名称。-r: 使用正则匹配项目名称。
示例:
# 在所有项目中执行 git log,查看最近一次提交
repo forall -c 'git log -1 --oneline'
# 清理所有项目中的未跟踪文件 (慎用!)
repo forall -c 'git clean -fdx'
# 仅在名字包含 'platform' 的项目中执行命令
repo forall -r platform -c 'git status'
7. repo prune
删除已经合并的分支。
用法:
repo prune [<PROJECT_LIST>]
说明:
如果你的本地分支已经合并到了上游分支(Manifest 指定的分支),运行此命令会安全地删除这些本地分支。
8. repo abandon
强制删除指定分支。相当于 git branch -D。
用法:
repo abandon <BRANCH_NAME> [<PROJECT_LIST>]
示例:
# 删除所有项目中的 'feature/old-feature' 分支
repo abandon feature/old-feature --all
9. repo diff
显示提交和工作树之间的差异。
用法:
repo diff [<PROJECT_LIST>]
说明:
相当于在每个目录下执行 git diff。
10. repo download
下载特定的更改(通常是 Gerrit 上的 Patch Set)到本地。
用法:
repo download <TARGET> <CHANGE>
示例:
# 下载 Change ID 为 12345 的第 1 个 Patch Set 到 platform/build 项目
repo download platform/build 12345/1
11. 批量储藏与恢复 (Stash)
虽然 Repo 没有直接的 stash 命令,但可以通过 forall 命令批量执行 git stash 来实现储藏功能。
用法:
repo forall -c "git stash [save 'message']"
常用场景:
-
储藏所有修改:
# 储藏并添加备注,方便查找 repo forall -c "git stash save 'backup_before_sync'" -
恢复所有修改:
repo forall -c "git stash pop" -
仅对特定模块储藏:
# 只储藏路径中包含 'drivers' 的仓库 repo forall -r drivers -c "git stash"
总结
| 命令 | 简述 | 常用参数 |
|---|---|---|
init |
初始化 Repo | -u <URL>, -b <BRANCH> |
sync |
同步代码 | -j<N>, -c, -d |
start |
创建分支 | --all, . |
status |
查看状态 | 无 |
upload |
提交代码 | --cbr |
forall |
批量执行命令 | -c <CMD>, -p |
prune |
删除已合并分支 | 无 |
abandon |
强制删除分支 | <BRANCH> |
forall ... stash |
批量储藏修改 | -c "git stash" |

浙公网安备 33010602011771号