Repo:是对 Git 构成补充的 Google 代码库管理工具。
Repo 可以在必要时整合多个 Git 代码库,将相关内容上传到 Gerrit 修订版本控制系统,并自动执行 Android 开发工作流程的部分环节。
Repo 启动器会提供一个 Python 脚本,该脚本可以初始化检出,并可以下载第二部分,即完整的 Repo 工具。完整的 Repo 工具包含在 Android 源代码检出中。该工具默认位于 $SRCDIR/.repo/repo/... 中,它可以从下载的 Repo 启动器接收转发的命令。
Repo 使用清单文件将 Git 项目汇总到 Android 超级项目中。您可以将 repo 命令(这是一个可执行的 Python 脚本)放在路径中的任何位置。使用 Android 源代码文件时,您可以使用 Repo 执行跨网络操作,例如使用一个 Repo 工作目录。
安装有两种方式,一种是基于操作系统安装。以Ubuntu为例,可以在系统中直接执行
sudo apt-get update
sudo apt-get install repo
安装成功后可以执行 version 查看版本
repo version
另外一种方式则是,从服务器上下载应用程序安装
wget 'https://storage.googleapis.com/git-repo-downloads/repo' -P /tmp/
sudo cp /tmp/repo /usr/local/bin/repo
sudo chmod +x /usr/local/bin/repo
也可以从国内服务器下载
echo "export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'" >> ~/.bashrc
source ~/.bashrc
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o /tmp/repo
sudo cp /tmp/repo /usr/local/bin/repo
sudo chmod +x /usr/local/bin/repo
repo
repo安装完成后,可以使用help命令查看其他命令的使用方法
repo help
例如查看init 的使用方法
repo help init
$ repo init -u []
在当前目录中安装 Repo。这会创建一个 .repo/
目录,其中包含用于 Repo 源代码和标准 Android 清单文件的 Git 代码库。该 .repo/
目录中还包含 manifest.xml
,这是一个指向 .repo/manifests/
目录中所选清单的符号链接。
选项:
-u
:指定要从中检索清单代码库的网址。您可以在 https://android.googlesource.com/platform/manifest
中找到常见清单-m
:在代码库中选择清单文件。如果未选择任何清单名称,则会默认选择 default.xml。-b
:指定修订版本,即特定的清单分支。repo sync []
执行完‘repo sync’之后就可以在目录中执行‘repo sync’进行代码同步,这部操作类似git clone 。
repo sync
运行成功后,指定项目中的代码会与远程代码库中的代码保持同步。
-d
:将指定项目切换回清单修订版本。如果项目当前属于某个主题分支,但只是临时需要清单修订版本,则此选项会有所帮助。-s
:同步到当前清单中清单服务器元素指定的一个已知的良好版本。-f
:即使某个项目同步失败,系统也会继续同步其他项目。repo upload []
上传代码,这个上传代码并不是直接上传到服务器中,而是先上传到gerrit上进行review进行审核,审核通过之后才可以上传。
greeit服务器地址是在mainifests中指定的,.repo/manifest.xml
Gerrit说明:
Reviewer:代码审阅人员可以是多个,是需要人为指定的。Gerrit提供网页的操作,可以填选Reviewer。当有多个git库的改动提交时,为了避免在网页上频繁的填选Reviewer这种重复劳动, upload提供了–re, –reviewer参数,在命令行一次性指定Reviewer
Commit-ID:git为了标识每个提交,引入了Commit-ID,是一个SHA-1值,针对当次提交内容的一个Checksum,可以用于验证提交内容的完整性
Change-ID:Gerrit针对每一个Review任务,引入了一个Change-ID,每一个提交上传到Gerrit,都会对应到一个Change-ID, 为了区分于Commit-ID,Gerrit设定Change-ID都是以大写字母 “I” 打头的。 Change-ID与Commit-ID并非一一对应的,每一个Commit-ID都会关联到一个Change-ID,但Change-ID可以关联到多个Commit-ID
Patch-Set:当前需要Review的改动内容。一个Change-ID关联多个Commit-ID,就是通过Patch-Set来表现的,当通过git commit --amend
命令修正上一次的提交并上传时, Commit-ID已经发生了变化,但仍可以保持Change-ID不变,这样,在Gerrit原来的Review任务下,就会出现新的Patch-Set。修正多少次,就会出现多少个Patch-Set, 可以理解,只有最后一次修正才是我们想要的结果,所以,在所有的Patch-Set中,只有最新的一个是真正有用的,能够合并的。
diff
repo diff []
使用 git diff
显示提交与工作树之间的明显更改。
repo download
upload是把改动内容提交到Gerrit,download是从Gerrit下载改动。与upload一样,download命令也是配合Gerrit使用的。
例如,要将更改 23823 下载到您的平台/编译目录,请运行以下命令:
$ repo download platform/build 23823
repo sync
应该可以有效移除通过 repo download
检索到的任何提交。或者,您可以将远程分支检出,例如 git checkout m/master
。
repo forall [] -c
$ repo status []
status用于查看多个git库的状态。实际上,是对git status
命令的封装。
下面以下载rockpi4 的安卓源码为例
创建rockpi 文件夹,执行repo init 命令
$ mkdir rockpi && cd rockpi
$ repo init -u https://github.com/radxa/manifests.git \
-b rockchip-android-10
-m rockchip-q-release.xml
# -u 指定要从中检索清单代码库的网址
# -b 在代码库中选择清单文件。如果未选择任何清单名称,则会默认选择 default.xml。
# -m 指定修订版本,即特定的清单分支
执行完命令之后,就会在当前文件夹中生成一个.repo 的文件夹。
$ repo init -u https://github.com/radxa/manifests.git \
-b rockchip-android-10 \
-m rockchip-q-release.xml
repo sync -d --no-tags -j4
# -d:将指定项目切换回清单修订版本
# -j: 指定线程
“gnutls_handshake() failed: Error in the pull function”
解决方法:
sudo apt-get -y install build-essential nghttp2 libnghttp2-dev libssl-dev