android 源码管理工具repo

发布于:2022-11-09 ⋅ 阅读:(10) ⋅ 点赞:(0) ⋅ 评论:(0)

概述

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 <COMMAND> <OPTIONS>

重要命令

help

repo安装完成后,可以使用help命令查看其他命令的使用方法

repo help <COMMAND>

例如查看init 的使用方法

repo help init

 

 

init

$ repo init -u <URL> [<OPTIONS>]

在当前目录中安装 Repo。这会创建一个 .repo/ 目录,其中包含用于 Repo 源代码和标准 Android 清单文件的 Git 代码库。该 .repo/ 目录中还包含 manifest.xml,这是一个指向 .repo/manifests/ 目录中所选清单的符号链接。

选项:

  • -u:指定要从中检索清单代码库的网址。您可以在 https://android.googlesource.com/platform/manifest 中找到常见清单
  • -m:在代码库中选择清单文件。如果未选择任何清单名称,则会默认选择 default.xml。
  • -b:指定修订版本,即特定的清单分支。

sync

repo sync [<PROJECT_LIST>]

执行完‘repo sync’之后就可以在目录中执行‘repo sync’进行代码同步,这部操作类似git clone 。

repo sync 运行成功后,指定项目中的代码会与远程代码库中的代码保持同步。

  • -d:将指定项目切换回清单修订版本。如果项目当前属于某个主题分支,但只是临时需要清单修订版本,则此选项会有所帮助。
  • -s:同步到当前清单中清单服务器元素指定的一个已知的良好版本。
  • -f:即使某个项目同步失败,系统也会继续同步其他项目。
    • j : 使用多线程进行同步,默认4线程
  • -c: 只同步指定分支,默认同步所有分支。

其他命令

  • upload
repo upload [<PROJECT_LIST>]

上传代码,这个上传代码并不是直接上传到服务器中,而是先上传到gerrit上进行review进行审核,审核通过之后才可以上传。

greeit服务器地址是在mainifests中指定的,.repo/manifest.xml

<remote name="aosp"
fetch=".."
review="https://android-review.googlesource.com/" />

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 [<PROJECT_LIST>]

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

  • download
repo download <TARGET> <CHANGE>

upload是把改动内容提交到Gerrit,download是从Gerrit下载改动。与upload一样,download命令也是配合Gerrit使用的。

例如,要将更改 23823 下载到您的平台/编译目录,请运行以下命令:

$ repo download platform/build 23823

repo sync 应该可以有效移除通过 repo download 检索到的任何提交。或者,您可以将远程分支检出,例如 git checkout m/master

  • forall
repo forall [<PROJECT_LIST>] -c <COMMAND>
  • status
$ repo status [<PROJECT_LIST>]

status用于查看多个git库的状态。实际上,是对git status命令的封装。

实际操作

下面以下载rockpi4 的安卓源码为例

init

创建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

sync

repo sync -d --no-tags -j4
# -d:将指定项目切换回清单修订版本
# -j: 指定线程

注意:repo 现在已经不支持Python2 ,所以在使用repo时应将系统的Python改为python3

执行报错:

“gnutls_handshake() failed: Error in the pull function”

解决方法:

sudo apt-get -y install build-essential nghttp2 libnghttp2-dev libssl-dev