Repo 命令参考

Repo 通过简化跨多个代码库的工作,对 Git 进行了补充。如需了解 Repo 和 Git 之间关系的说明,请参阅源代码控制工具。如需详细了解 Repo,请参阅Repo README

Repo 的使用形式如下

repo command options

可选元素显示在方括号 [] 中。例如,许多命令都将 project-list 用作参数。您可以将 project-list 指定为项目名称列表或项目本地源代码目录的路径列表

repo sync [project0 project1 ... projectn]
repo sync [/path/to/project0 ... /path/to/projectn]

help

repo help

提供有关 repo 命令的帮助。您可以查看有关特定 Repo 命令的详细信息,方法是将命令指定为选项

repo help command

例如,以下命令会生成 init 命令的说明和选项列表

repo help init

或者,要仅查看命令的可用选项列表,请运行

repo command --help

例如

repo init --help

init

repo init -u url [options]

在当前目录中安装 Repo。此命令会创建一个 .repo/ 目录,其中包含 Repo 源代码和标准 Android 清单文件的 Git 代码库。

选项

  • -u:指定从中检索清单代码库的网址。常见清单位于 https://android.googlesource.com/platform/manifest

  • -m:选择代码库中的清单文件。如果未选择清单名称,则默认名称为 default.xml

  • -b:指定修订版本,即特定的 manifest-branch

sync

repo sync [project-list]

下载新更改并更新本地环境中的工作文件,实际上相当于对所有 Git 代码库执行 git fetch。如果您在不带参数的情况下运行 repo sync,它会同步所有项目的文件。

当您运行 repo sync 时,会发生以下情况

  • 如果项目从未同步过,则 repo sync 相当于 git clone;远程代码库中的所有分支都会复制到本地项目目录。

  • 如果项目之前已同步过,则 repo sync 相当于

    git remote update
    git rebase origin/branch
    

    其中 branch 是本地项目目录中当前检出的分支。如果本地分支未跟踪远程代码库中的分支,则不会对该项目进行同步。

成功运行 repo sync 后,指定项目中的代码将是最新的,并且与远程代码库中的代码同步。

主要选项

  • -c:仅从服务器提取当前的清单分支。
  • -d:将指定项目切换回清单修订版本。如果项目位于主题分支上,但暂时需要清单修订版本,则此选项很有用。
  • -f:即使项目同步失败,也继续同步其他项目。
  • -j threadcount:跨线程拆分同步以加快完成速度。确保您没有使机器不堪重负 - 为其他任务保留一些 CPU。要查看可用 CPU 的数量,请先运行 nproc --all
  • -q:以静默方式运行,禁止显示状态消息。
  • -s:同步到当前清单中 manifest-server 元素指定的已知良好 build。

如需了解更多选项,请运行 repo help sync

upload

repo upload [project-list]

将更改上传到审核服务器。对于指定的项目,Repo 会将本地分支与上次 Repo 同步期间更新的远程分支进行比较。Repo 会提示您选择一个或多个尚未上传以供审核的分支。

然后,所选分支上的所有提交都会通过 HTTPS 连接传输到 Gerrit。您需要配置 HTTPS 密码才能启用上传授权。要生成用于 HTTPS 的新用户名/密码对,请访问密码生成器

当 Gerrit 通过其服务器接收到对象数据时,它会将每个提交转换为一个更改,以便审核者可以评论特定的提交。要将多个检查点提交合并为一个提交,请在运行 upload 之前使用 git rebase -i

如果您在不带参数的情况下运行 repo upload,它会在所有项目中搜索要上传的更改。

要在更改上传后对其进行编辑,请使用 git rebase -igit commit --amend 等工具来更新您的本地提交。完成编辑后

  • 验证更新后的分支是否是当前检出的分支。
  • 使用 repo upload --replace PROJECT 打开更改匹配编辑器。
  • 对于序列中的每个提交,在方括号内输入 Gerrit 更改 ID

    # Replacing from branch foo
    [ 3021 ] 35f2596c Refactor part of GetUploadableBranches to lookup one specific...
    [ 2829 ] ec18b4ba Update proto client to support patch set replacements
    # Insert change numbers in the brackets to add a new patch set.
    # To create a new change record, leave the brackets empty.
    

上传完成后,更改将具有额外的补丁程序集。

如果您只想上传当前检出的 Git 分支,请使用标记 --current-branch(或简写形式 --cbr)。

对于相关的更改,将所有 CL 保留在同一主题中很有用。您可以使用 --topic=TOPIC 在上传时添加主题名称。或者,只需传递 -t 即可将主题名称设置为与本地分支名称相同。

diff

repo diff [project-list]

使用 git diff 显示提交与工作树之间未完成的更改。

download

repo download target change

从审核系统下载指定的更改,并使其在您项目的本地工作目录中可用。

例如,要将 更改 23823 下载到您的 platform/build 目录中

repo download platform/build 23823

运行 repo sync 会移除使用 repo download 检索到的任何提交。或者,您可以使用 git checkout m/main 检出远程分支。

forall

repo forall [project-list] -c command

在每个项目中执行给定的 shell 命令。repo forall 提供以下附加环境变量

  • REPO_PROJECT 设置为项目的唯一名称。
  • REPO_PATH 是相对于客户端根目录的路径。
  • REPO_REMOTE 是清单中远程系统的名称。
  • REPO_LREV 是清单中修订版本的名称,转换为本地跟踪分支。如果您需要将清单修订版本传递给本地执行的 Git 命令,请使用此变量。
  • REPO_RREV 是清单中修订版本的名称,与清单中完全一致。

选项

  • -c:要执行的命令和参数。该命令通过 /bin/sh 进行评估,其后的任何参数都作为 shell 位置参数传递。
  • -p:在指定命令的输出之前显示项目标头。这通过将管道绑定到命令的 stdin、stdout 和 sterr 流来实现,并将所有输出通过管道传输到在单个分页器会话中显示的连续流中。
  • -v:显示命令写入 stderr 的消息。

prune

repo prune [project-list]

修剪(删除)已合并的主题。

start

repo start branch-name [project-list]

从清单中指定的修订版本开始,为开发启动新分支。

BRANCH_NAME 参数简要描述您尝试对项目进行的更改。如果您不知道,请考虑使用名称 default

project-list 参数指定哪些项目参与此主题分支。

status

repo status [project-list]

比较指定项目中每个项目的工作树与暂存区(索引)以及此分支上的最新提交(HEAD)。显示每个文件的摘要行,其中这三个状态之间存在差异。

要仅查看当前分支的状态,请运行 repo status .。状态信息按项目列出。对于项目中的每个文件,使用一个双字母代码。

在第一列中,大写字母表示暂存区与上次提交状态的不同之处。

字母 含义 说明
- 无更改 在 HEAD 和索引中相同
A 已添加 不在 HEAD 中,在索引中
M 已修改 在 HEAD 中,在索引中已修改
D 已删除 在 HEAD 中,不在索引中
R 已重命名 不在 HEAD 中,路径在索引中已更改
C 已复制 不在 HEAD 中,从索引中的另一个位置复制而来
T 模式已更改 HEAD 和索引中的内容相同,模式已更改
U 未合并 HEAD 和索引之间存在冲突;需要解决

在第二列中,小写字母表示工作目录与索引的不同之处。

字母 含义 说明
- 新/未知 不在索引中,在工作树中
m 已修改 在索引中,在工作树中,已修改
d 已删除 在索引中,不在工作树中

处理 repo 错误

git commit -a # Commit local changes first so they aren't lost.
repo start branch-name # Start the branch
git reset --hard HEAD@{1} # And reset the branch so that it matches the commit before repo start
repo upload .

当会话开始时未运行 repo start 命令时,会出现错误 repo: error: no branches ready for upload。要恢复,您可以检查提交 ID,启动新分支,然后合并它。