前言
repo 是一个用于管理多个 Git 仓库的工具,特别适用于管理大型项目如 Android 的源码。它是由 Google 开发的,用于解决多个 Git 仓库的同步、管理和代码审查等问题。因此,做 Android 内核开发,首先要了解 repo 是什么,它是如何使用的?
1 repo 的概念
repo 是一种代码版本管理工具,它是由一系列的 Python 脚本组成,封装了一系列的 Git 命令,用来统一管理多个 Git 仓库。
2 repo 的作用
Android 源码引用了很多开源项目,每一个子项目都是一个 Git 仓库,每个 Git 仓库都有很多分支版本,为了方便统一管理各个子项目的 Git 仓库,需要一个上层工具批量进行处理,因此 repo 诞生。
repo 也会建立一个 Git 仓库,用来记录当前 Android 版本下各个子项目的 Git 仓库分别处于哪一个分支,这个仓库通常叫做:manifest 仓库。
3 repo 的安装
官方的 repo 脚本下载方法:
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ./repo
由于官网被墙,目前可以使用的 repo 脚本下载方法如下(clone 命令两者选一):
$ git clone git://git.omapzoom.org/git-repo.git
$ git clone git://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/
$ cp git-repo/repo ./repo
4 源码的下载
Android 源码分支其实由一个叫 manifest 仓库来管理起来的,因此,下载源码首先要 clone 这个 manifest 仓库。这个仓库里面有一个 XML 文件,其实就是一个文件清单,列出了本代码仓库依赖哪些代码,该去哪下载,分支是什么。
一般用 repo init 命令来 clone 这个 manifest 仓库,例如,如果要下载 Android 源码,则方法如下:
$ repo init -u https://android.googlesource.com/platform/manifest
当然,上面的官网被墙了,因此,推荐如下镜像(两者选一):
$ repo init -u git://git.omapzoom.org/platform/manifest.git
$ repo init -u git://aosp.tuna.tsinghua.edu.cn/android/platform/manifest
初始化完毕后,你会在本地的.repo 文件夹中看到 manifest 仓库的内容,这个文件夹中最重要的文件是 manifest.xml(有的仓库用的是 default.xml,然后指向具体的 xml),它就是上面说到的文件清单。
如果要选择特定版本的 Android 源码,或者在已下载的源码基础上切换到其他版本,则可以使用-b选项:
$ repo init -u git://git.omapzoom.org/platform/manifest.git -b android-13.0.0_r3
$ repo init -u git://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-13.0.0_r3
然后使用 repo sync 命令进行同步即可下载好全部的 Android 源码了。
5 manifest.xml 文件清单的组成
上面提到了 repo init 需要初始化一个 manifest 仓库,仓库中含有一个很重要的 manifest.xml 文件清单,其实这个 manifest.xml 并不复杂的,它就是用 XML 文件的格式记录了本项目依赖的各个 Git 仓库的名称、地址,以及分支等信息。常用的元素如下所示:
- manifest 最顶层的 XML 元素
- remote 设置远程 git 服务器的属性,如名称、根 URL 地址等
- project 需要 clone 的 Git 仓库,path 表示本机路径,name 表示远程版本库的相对路径
- copyfile 执行拷贝操作,把URL/ s r c 地址的文件拷贝到 . / src地址的文件拷贝到./ src地址的文件拷贝到./dest
其实,如果不使用 repo 工具,也是可以对照 manifest.xml 文件清单直接使用“git clone”的方式一个 project 一个 project 的下载的,然后对每个 project 进行 git checkout 特定的分支。
6 常用 repo 命令
常用命令如下:
- 初始化 repo 仓库
repo init
- 下载最新源码
repo sync
- 创建分支
repo start
- 换分支
repo checkout
- 查看分支
repo branches
- 查看文件状态
repo status
- 查看修改
repo diff
- 查看仓库信息
repo info