25.3 repo和清单库的初始化
下载并保存repo引导脚本后,建立一个工作目录,这个工作目录将作为Android的工作区目录。在工作目录中执行repo init-u<url>,完成repo完整的下载及项目清单版本库(manifest.git)的下载。
$mkdir working-directory-name
$cd working-directory-name
$repo init-u git://android.git.kernel.org/platform/manifest.git
命令repo init要完成如下操作:
完成repo这一工具的完整下载,因为现在有的不过是repo的引导程序。
初始化操作会从android的代码中克隆repo.git库到当前目录下的.repo/repo目录下。在完成repo.git克隆之后,repo init命令会将控制权交给工作区的.repo/repo/main.py,这个刚刚从repo.git库克隆来的脚本文件,继续进行初始化。
克隆android的清单库manifest.git(地址来自于-u参数)。
克隆的清单库位于.repo/manifests.git中,本地克隆到.repo/manifests。清单文件.repo/manifest.xml只是符号链接,它指向.repo/manifests/default.xml。
询问用户的姓名和邮件地址,如果和Git默认的用户名、邮件地址不同,则记录在.repo/manifests.git库的config文件中。
命令repo init还可以附带—mirror参数,以建立和上游Android的版本库一模一样的镜像。这会在后面的章节介绍。
1.从哪里下载repo.git?
在repo引导脚本的前几行,定义了默认的repo.git的版本库位置及要检出的默认分支。
REPO_URL='git://android.git.kernel.org/tools/repo.git'
REPO_REV='stable'
如果不想从默认URL地址中获取repo,或者不想获取稳定版(stable分支)的repo,可以在repo init子命令中通过下面的参数覆盖默认的设置,从指定的源地址克隆repo代码库:
参数—repo-url,用于设定repo的版本库地址。
参数—repo-branch,用于设定要检出的分支。
参数—no-repo-verify,设定不要对repo的里程碑签名进行严格的验证。
实际上,完成repo.git版本库的克隆,这个repo引导脚本就江郎才尽了,repo init命令的后续处理(以及其他子命令)都交给刚刚克隆出来的.repo/repo/main.py来继续执行。
2.清单库是什么?从哪里下载?
清单库实际上只包含一个default.xml文件。这个XML文件定义了多个版本库和本地地址的映射关系,是repo工作的指引文件。所以在使用repo引导脚本进行初始化的时候,必须通过-u参数指定清单库的源地址。
清单库的下载,是通过repo init命令初始化时,用-u参数指定清单库的位置。例如repo针对Android代码库进行初始化时执行的命令:
$repo init-u git://android.git.kernel.org/platform/manifest.git
repo引导脚本的init子命令可以使用下列和清单库相关的参数:
参数-u(—manifest-url):设定清单库的Git服务器地址。
参数-b(—manifest-branch):检出清单库的特定分支。
参数—mirror:只在repo第一次初始化的时候使用,以和Android服务器同样的结构在本地建立镜像。
参数-m(—manifest-name):当有多个清单文件时,可以指定清单库的某个清单文件为有效的清单文件。默认为default.xml。
repo初始化命令(repo init)可以执行多次:
不带参数地执行repo init,从上游的清单库获取新的清单文件default.xml。
使用参数-u(—manifest-url)执行repo init,会重新设定上游的清单库地址,并重新同步。
使用参数-b(—manifest-branch)执行repo init,会使用清单库的不同分支,以便在使用repo sync时将项目同步到不同的里程碑。
但是不能使用—mirror命令,该命名只能在第一次初始化时执行。那么如何将已经按照工作区模式同步的版本库转换为镜像模式呢?后面会看到一个解决方案。