25.5 同步项目

在工作区执行下面的命令,会参照.repo/manifest.xml清单文件,将项目所有相关的版本库全部克隆出来。不过最好请在读完本节内容之后再尝试执行这条命令。


$repo sync


对于Android,这个操作需要通过网络传递接近2个GB的内容,如果带宽不是很高的话,可能会花掉几个小时甚至是一天的时间。

也可以仅克隆感兴趣的项目,在repo sync后面跟上项目的名称。项目的名称来自于.repo/manifest.xml这个XML文件中project元素的name属性值。例如克隆platform/build项目:


$repo sync platform/build


repo有一个功能可以在这里展示,就是repo支持通过本地清单对默认的清单文件进行补充及覆盖。即可以在.repo目录下创建local_manifest.xml文件,其内容会和.repo/manifest.xml文件的内容进行合并。

在工作目录下运行下面的命令可以创建一个本地清单文件。这个本地定制的清单文件来自默认文件,但是删除了remote元素和default元素,并将所有的project元素都重命名为remove-project元素。这实际相当于对原有的清单文件“取反”。


$curl-L-k\

http://www.ossxp.com/doc/gotgit/download/ch25/manifest-revert.xslt\

>manifest-revert.xslt

$xsltproc manifest-revert.xslt.repo/manifest.xml>.repo/local_manifest.xml


用下面的这条命令可以看到repo运行时实际获取到的清单。这个清单来自于.repo/manifest.xml和.repo/local_manifest.xml两个文件的汇总。


$repo manifest-o-


当执行repo sync命令时,实际上就是依据合并后的清单文件进行同步。如果清单中的项目被自定义清单全部“取反”,执行同步就不会同步任何项目,甚至会删除已经完成同步的项目。

本地定制的清单文件local_manifest.xml支持前面介绍的清单文件的所有语法,需要注意的是:

不能出现重复定义的remote元素。这就是为什么上面的脚本要删除来自默认manifest.xml的remote元素。

不能出现default元素,因为全局只能有一个。

不能出现重复的project定义(name属性不能相同),但是可以通过remove-project元素将默认清单中定义的project删除然后再重新定义。

试着编辑.repo/local_manifest.xml,在其中再添加几个project元素,然后试着用repo sync命令进行同步。