Repo 命令详解指南

Repo 命令详解指南

Repo 是 Google 用 Python 脚本编写的工具,用于在 Android 环境下管理多个 Git 仓库。它并不是用来取代 Git,而是为了让开发者更方便地管理多个 Git 库。

核心工作流

  1. 初始化 (init): 下载 Manifest 仓库。
  2. 同步 (sync): 下载所有代码仓库。
  3. 开发 (start): 创建本地开发分支。
  4. 工作 (git): 在具体仓库中进行 Git 操作 (add, commit)。
  5. 储藏 (forall ... stash): 临时保存未提交的修改。
  6. 上传 (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>]

流程:

  1. 运行命令后,Repo 会搜索所有项目中尚未上传的提交。
  2. 它会打开编辑器让你确认要上传的分支和提交。
  3. 确认后,代码会被推送到 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"
posted @ 2026-03-09 15:36  Trigger-CN  阅读(8)  评论(0)    收藏  举报