1. 简介
repo是google用来管理Git仓库的工具。
The Repo Launcher provides a Python script that initializes a checkout and downloads the second part, the full Repo tool. The full Repo tool is included in an Android source code checkout. It’s located, by default, in $SRCDIR/.repo/repo/...
and it receives forwarded commands from the downloaded Repo Launcher.
repo不是用来替换Git,只是让你更方便的使用Git。
运行repo version
命令,将会得到与下方相似的报告
<repo not installed>
repo launcher version 2.15
(from /usr/bin/repo)
- 如果报告的 repo launcher version 编号为
2.15
或更高,则表明版本号正确,安装无误。 - (
from /usr/bin/repo
) 表明是通过软件包进行安装的。 - (
from /home/<>/bin/repo
) 表明是手动安装的。
本地开发机:
<repo not installed>
repo launcher version 2.15
(from /home/user/bin/repo)
git 2.17.1
Python 3.6.9 (default, Jan 26 2021, 15:33:00)
[GCC 8.4.0]
OS Linux 5.4.0-87-generic (#98~18.04.1-Ubuntu SMP Wed Sep 22 10:45:04 UTC 2021)
CPU x86_64 (x86_64)
Bug reports: https://bugs.chromium.org/p/gerrit/issues/entry?template=Repo+tool+issue
在已经repo init的aosp仓库
repo version v1.13.8
(from ssh://xxx@review.xxx.cn:29418/tools/git-repo)
repo launcher version 2.15
(from /home/user/bin/repo)
(currently at 1.13.8)
repo User-Agent git-repo/1.13.8 (Linux) git/2.17.1 Python/3.6.9
git 2.17.1
git User-Agent git/2.17.1 (Linux) git-repo/1.13.8
Python 3.6.9 (default, Jan 26 2021, 15:33:00)
[GCC 8.4.0]
远程服务器:
error: command 'version' requires repo to be installed first.
Use "repo init" to install it here.
在已经初始化的aosp仓库
repo version v1.13.8
(from ssh://xxx@review.xxx.cn:29418/tools/git-repo)
repo launcher version 1.26
(from /home/e0004020/bin/repo)
(currently at 1.13.8)
repo User-Agent git-repo/1.13.8 (Linux) git/2.17.1 Python/2.7.17
git 2.17.1
git User-Agent git/2.17.1 (Linux) git-repo/1.13.8
Python 2.7.17 (default, Feb 27 2021, 15:10:58)
[GCC 7.5.0]
2. 使用
2.1 help
使用repo help
查看总的帮助信息
使用该命令repo help command
查看具体某个command的信息
使用命令repo command --help
只查看该命令的可用参数
2.2 init
repo init -u url [options]
在当前目录中安装 Repo。这样会创建一个 .repo/ 目录,其中包含存放 Repo 源代码和标准 Android manifest 文件的 Git 代码库。
选项:
-u
:指定从中检索manifest代码库的网址。常见清单如https://android.googlesource.com/platform/manifest
。-m
:选择代码库中的清单文件。如果未选择清单名称,则默认为 default.xml。-b
:指定修订版本,即特定的manifest-branch
。
Note: For all remaining Repo commands, the current working directory must either be the parent directory of .repo/
or a subdirectory of the parent directory.
2.3 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 是本地项目目录中当前已checkouted-out
的分支。如果本地分支没有在跟踪远程代码库中的分支,则项目不会发生任何同步。
- 如果 Git rebase 操作导致合并冲突,请使用常规 Git 命令(例如 git rebase --continue)来解决冲突。
成功运行 repo sync
后,指定项目中的代码即处于最新状态,并已与远程代码库中的代码同步。
下面是几个重要选项。
-c
:仅获取服务器中的当前manifest分支。-d
:将指定项目切换回清单修订版本。如果项目当前属于某个主题分支,但临时需要manifest修订版本,则此选项会有所帮助。-f
:即使某个项目同步失败,也继续同步其他项目。-jthreadcount
:将同步操作拆分成多个线程,以更快地完成。确保不会使计算机超负荷运行 - 为其他任务预留一些 CPU。-q
:通过抑制状态消息来确保运行过程没有干扰。-s
:同步到当前清单中的manifest-server
元素指定的一个已知良好 build。
2.4 upload
a) 如果本地有代码修改,需要提交,请到相应的工作目录,按照git的commit方式提交,上传的时候才需要用到repo
b) 如果改动的工程较多,建议用repo stage命令来增加文件的track动作,但是提交就要到相应的目录里面老老实实的用git commit来提交了。
c) Repo upload 命令在上传代码时,仅是上传到gerrit,还需要进行review后才会在代码库中体现。格式为 repo upload --re=zan.wang kernel。这里的kernel为project名称。这里的--re添加review人员命令,我试过是无效的,不知道是否是本地服务器有问题。Upload过程根据屏幕提示,确认几次。成功后,到172.16.99.44:8080 gerrit服务器添加审核人员。
d) 如果远程的git库有可写权限,也可以在每个project下面用git进行提交,不过目前仅是可读权限,如果个别人员开放了写权限,可以进行此操作,和单独操作git库无异。
e) 目前i800JB项目的remote名称为phicomm,可以查看在manifests库里面的i800JB.xml文件。用git上传某个project的修改时需注意这里的remote为phicomm,而非origin。
repo upload [project-list]
对于指定的项目,Repo 会将本地分支与最后一次 repo sync 时更新的远程分支进行比较。Repo 会提示您选择一个或多个尚未上传以供审核的分支。
接下来,所选分支上的所有提交都会通过 HTTPS 连接传输到 Gerrit。您需要配置一个 HTTPS 密码以启用上传授权。如需生成新的用户名/密码对以用于 HTTPS 传输,请访问密码生成器。
当 Gerrit 通过其服务器接收对象数据时,它会将每项提交转变成一项更改,以便审核者可以针对特定提交给出意见。如需将几项“检查点”提交合并为一项提交,请运行 git rebase -i 然后再运行 upload。
如果在未使用任何参数的情况下运行 repo upload,则该命令会在所有项目中搜索要上传的更改。
如需在更改上传后对其进行修改,请使用 git rebase -i 或 git commit --amend 等工具更新您的本地提交内容。修改完成之后,请执行以下操作:
- 进行验证以确保更新后的分支是当前已检出的分支。
- 对于相应系列中的每项提交,请在方括号内输入 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 replacments
# 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)。
2.5 查看分支
repo branch
如:
user@user-600-G5:~/xxx/project/Android12$ repo branch
Android12 | in:
device/xxx/common
device/xxx/xxx_evb
vendor/xxx/proprietary/external/nativeui
vendor/xxx/proprietary/hardware/hidl_impl
vendor/xxx/proprietary/hardware/interfaces
* system_upgrade12 | in all projects
2.6 删除不用的本地分支
$ repo abandon 分支名 [<project>…]
2.7 prune
repo prune [project-list]
删减(删除)已合并的分支。
实际上是对git branch –d命令的封装,该命令用于扫面项目的各个分支,并删除已经合并的分支
2.8 切换分支
$ repo checkout <branchname> [<project>…]
实际上是对git checkout 命令的封装,但不能带-b参数,所以不能用此命令来创建特性分支。
2.9 diff
repo diff [project-list]
使用 git diff 显示提交与工作树之间的明显更改。
2.10 download
repo download target change
从审核系统中下载指定更改,并放在您项目的本地工作目录中供使用。
例如,如需将更改23823 下载到您的 platform/build 目录,请运行以下命令:
repo download platform/build 23823
运行 repo sync
会移除使用 repo download
检索到的所有提交内容。或者,您也可以使用 git checkout m/master
检出远程分支。
注意:由于全球的所有服务器均存在复制延迟,因此某项更改出现在网络上(位于 Gerrit 中)的时间与所有用户可通过 repo download 找到此项更改的时间之间存在些许的镜像延迟。
2.11 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 写入的消息。
2.12 start
repo start
branch-name [project-list]
从清单中指定的修订版本(revision)开始,创建一个新的分支进行开发。
BRANCH_NAME
参数用于简要说明您尝试对项目进行的更改。如果您不知道,请考虑使用名称 default。
project-list
参数指定了将参与此主题分支的项目。
如repo start xxx --all
创建所有项目的分支
2.13 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 | 已删除 | 存在于索引中,但不存在于工作树中 |
2.14 处理 repo 错误
$ git reflog
repo start branch-name
git merge commit-id
repo upload .
如果在会话开始时未运行 repo start 命令,系统会显示错误 repo: error: no branches ready for upload。
若要恢复,您可以检查提交 ID,创建新分支,然后将其合并。
2.15 切换版本
实际工作中用的一种用法
ls ./repo/manifests/daily
repo init -m daily/xxx.xml
参考:
Repo 使用详解
评论