Skip to content
01.版本控制»02.repo工具»LV005-repo简介.md

LV005-repo简介

一、repo 简介

1. 什么是 repo?

repo,是一个多项目协同管理工具,为组件化客户端项目提供便捷。它其实是 Google 开发的用于管理 Android 版本库的一个工具,repo 是使用 Python 对 git 进行了一定的封装,并不是用于取代 git,它简化了对多个 Git 版本库的管理。用 repo 管理的版本库都需要使用 git 命令来进行操作。因此,使用 repo 工具之前,请先确保已经安装 git。

2. 为什么要使用它

一个软件工程由于需要不断迭代开发,因此要对源代码进行版本管理。Android 源代码工程(AOSP)也不例外,它采用 Git 来进行版本管理。AOSP 作为一个大型开放源代码工程,由许许多多子项目组成,因此不能简单地用 Git 进行管理,它在 Git 的基础上建立了一套自己的代码仓库,并且使用工具 Repo 进行管理。

现代的代码版本管理工具,SVN 和 Git 是最流行的。SVN 是一种集中式的代码管理工具,需要有一个中心服务器,而 Git 是一种分布式的代码管理工具。不需要一个中心服务器。不需要中心服务器意味着在没有网络的情况下,Git 也能进行版本管理。因此,单从这一点出发,Git 要比 SVN 要方便很多。当然,Git 和 SVN 相比,还有许多不同的理念设计,但是总的来说,Git 越来越受到大家的青睐,尤其是在开源社区。Linux 是采用 Git 进行版本管理,而越来越火的 GitHub,提供也是 Git 代码管理服务。

前面提到,AOSP 是由许许多项目组成的,例如,在 Android 4.2 中,就包含了 329 个项目,每一个项目都是一个独立的 Git 仓库。这意味着,如果我们要创建一个 AOSP 分支来做 feature 开发,那么就需要到每一个子项目去创建对应的分支。这显然不能手动地到每一个子项目里面去创建分支,必须要采用一种自动化的方式来处理。这些自动化处理工作就是由 Repo 工具来完成的。当然,Repo 工具所负责的自动化工作不只是创建分支那么简单,查看分支状态、提交代码、更新代码等基础 Git 操作它都可以完成。

Repo 工具实际上是由一系列的 Python 脚本组成的,这些 Python 脚本通过调用 Git 命令来完成自己的功能。比较有意思的是,组成 Repo 工具的那些 Python 脚本本身也是一个 Git 仓库。这个 Git 仓库在 AOSP 里面就称为 Repo 仓库。我们每次执行 Repo 命令的时候,Repo 仓库都会对自己进行一次更新。

上面我们讨论的是 Repo 仓库,但是实际上我们执行 Repo 命令想操作的是 AOSP。这就要求 Repo 命令要知道 AOSP 都包含有哪些子项目,并且要知道这些子项目的名称、仓库地址是什么。换句话说,就是 Repo 命令要知道 AOSP 所有子项目的 Git 仓库元信息。我们知道,AOSP 也是不断地迭代法变化的,例如,它的每一个版本所包含的子项目可能都是不一样的。这意味着需要通过另外一个 Git 仓库来管理 AOSP 所有的子项目的 Git 仓库元信息。这个 Git 仓库在 AOSP 里面就称为 Manifest 仓库(清单库)。

到目前为止,我们提到了三种类型的 Git 仓库,分别是 Repo 仓库、Manifest 仓库和 AOSP 子项目仓库。Repo 仓库通过 Manifest 仓库可以获得所有 AOSP 子项目仓库的元信息。有了这些元信息之后,我们就可以通过 Repo 仓库里面的 Python 脚本来操作 AOSP 的子项目。那么,Repo 仓库和 Manifest 仓库又是怎么来的呢?答案是通过一个独立的 Repo 脚本来获取,这个 Repo 脚本位于 AOSP 的一个官方网站上,我们可以通过 HTTP 协议来下载。

现在,我们就通过一个图来来勾勒一下整个 AOSP 的 Picture,它由 Repo 脚本、Repo 仓库、Manifest 仓库和 AOSP 子项目仓库组成,如图所示:

image-20240926230946701

二、怎么安装 repo?

这里我只在 ubuntu 中安装 repo 进行学习,windows 下也能装,但是好像问题比较多,就没去折腾了。

1. 准备工作

确保已经安装了 Python 和 git 两个软件以及 curl。

shell
sudo apt-get install git-core curl python3

为什么需要是Python3?因为使用的最新的repo脚本就是用python3运行的,后面可以点到源码看。

2. curl 命令下载

然后执行以下命令安装即可:

shell
mkdir -pv ~/02software/repo_bin # 创建安装目录

# curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/02software/repo_bin/repo # 国内站点 清华源
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/02software/repo_bin/repo # 国外站点

chmod a+x ~/02software/repo_bin/repo       # 赋予权限

echo "export PATH=~/02software/repo_bin:$PATH" >> ~/.bashrc # 添加环境变量
source ~/.bashrc # 使环境变量生效

其实下载下来的 repo 文件只是一个使用 Python 编写的引导脚本(Google 称之为 Repo launcher,本质上是一个 Python 脚本,可以使用 vim 打开的),完整的 repo(即,repo 的主体部分)还没有下载。

image-20240922160351689

3. 测试是否生效

我们直接开一个终端执行:

shell
repo --help

若安装成功则会有如下打印信息:

image-20240926214613640

三、repo 主体

1. Gitee 仓库

上面我们下载下来的只是 repo 的一个引导脚本,实际的主体部分还没下载,它的源码在 Gitee 上有一个仓库:oschina/repo

2. Google 官方参考资料

官网首页好像是这个:Google Code Archive - Long-term storage for Google Code Project Hosting.

image-20240926215025031

我们可以在这里找到它的文档(需要科学上网):Repo 命令参考资料 | Android Open Source Project image-20240926214937763

它的仓库在这里:GerritCodeReview/git-repo: repo,其实在主页都能找到。

莫道桑榆晚 为霞尚满天.