-
manifests
是个啥-
在
Repo
中manifests
描述了Repo客户端的结构,也就是可以从manifests
中知道各个模块的代码应该从代码管理仓库当中哪个位置去获取。 -
manifests
的基本结构是一个Git存储库,在顶层目录中持有一个default.xml
文件。
由于
manifests
保存在Git存储库中,在repo sync
期间会同时将manifests
的版本拉到最新 -
-
manifests
格式<!DOCTYPE manifest [<!ELEMENT manifest (notice?,remote*,default?,manifest-server?,remove-project*,project*,extend-project*,repo-hooks?,include*)><!ELEMENT notice (#PCDATA)><!ELEMENT remote EMPTY><!ATTLIST remote name ID #REQUIRED><!ATTLIST remote alias CDATA #IMPLIED><!ATTLIST remote fetch CDATA #REQUIRED><!ATTLIST remote pushurl CDATA #IMPLIED><!ATTLIST remote review CDATA #IMPLIED><!ATTLIST remote revision CDATA #IMPLIED><!ELEMENT default EMPTY><!ATTLIST default remote IDREF #IMPLIED><!ATTLIST default revision CDATA #IMPLIED><!ATTLIST default dest-branch CDATA #IMPLIED><!ATTLIST default upstream CDATA #IMPLIED><!ATTLIST default sync-j CDATA #IMPLIED><!ATTLIST default sync-c CDATA #IMPLIED><!ATTLIST default sync-s CDATA #IMPLIED><!ATTLIST default sync-tags CDATA #IMPLIED><!ELEMENT manifest-server EMPTY><!ATTLIST manifest-server url CDATA #REQUIRED><!ELEMENT project (annotation*,project*,copyfile*,linkfile*)><!ATTLIST project name CDATA #REQUIRED><!ATTLIST project path CDATA #IMPLIED><!ATTLIST project remote IDREF #IMPLIED><!ATTLIST project revision CDATA #IMPLIED><!ATTLIST project dest-branch CDATA #IMPLIED><!ATTLIST project groups CDATA #IMPLIED><!ATTLIST project sync-c CDATA #IMPLIED><!ATTLIST project sync-s CDATA #IMPLIED><!ATTLIST project sync-tags CDATA #IMPLIED><!ATTLIST project upstream CDATA #IMPLIED><!ATTLIST project clone-depth CDATA #IMPLIED><!ATTLIST project force-path CDATA #IMPLIED><!ELEMENT annotation EMPTY><!ATTLIST annotation name CDATA #REQUIRED><!ATTLIST annotation value CDATA #REQUIRED><!ATTLIST annotation keep CDATA "true"><!ELEMENT copyfile EMPTY><!ATTLIST copyfile src CDATA #REQUIRED><!ATTLIST copyfile dest CDATA #REQUIRED><!ELEMENT linkfile EMPTY><!ATTLIST linkfile src CDATA #REQUIRED><!ATTLIST linkfile dest CDATA #REQUIRED><!ELEMENT extend-project EMPTY><!ATTLIST extend-project name CDATA #REQUIRED><!ATTLIST extend-project path CDATA #IMPLIED><!ATTLIST extend-project groups CDATA #IMPLIED><!ATTLIST extend-project revision CDATA #IMPLIED><!ATTLIST extend-project remote CDATA #IMPLIED><!ELEMENT remove-project EMPTY><!ATTLIST remove-project name CDATA #REQUIRED><!ELEMENT repo-hooks EMPTY><!ATTLIST repo-hooks in-project CDATA #REQUIRED><!ATTLIST repo-hooks enabled-list CDATA #REQUIRED><!ELEMENT include EMPTY><!ATTLIST include name CDATA #REQUIRED> ]>
-
<manifest>
配置的顶层元素 -
<remote>
可以指定一个或者多个远程仓库,每一个remote
元素都指定了项目上传或者下载的地址。-
<name>
必填 指定该<remote>
元素的名称,该值会被各个项目中.git/config
引用,用于git pull
、git fetch
等操作。 -
<alias>
设定<name>
元素的别名,<name>
元素在manifests
中必须是唯一的,但是该元素可以重复出现在manifests
中。 -
<fetch>
必填 该<remote>
元素的Git URL前缀,Gitlab中有群组,也就是群组的链接,例:https://android.googlesource.com/ -
<pushurl>
用于git push
时推送的URL前缀,如果没有指定,那就是使用<fetch>
元素的值。 -
<review>
指定gerrit的服务器名,用于repo upload
操作。如果没有指定,则repo upload
没有效果。 -
<revision>
Git 分支的名称(例如master
或refs/heads/master
)。具有自己版本的遥控器将覆盖默认版本。
-
-
<default>
设定所有projects的默认属性值,如果在<project>
元素里没有指定一个属性,则使用<default>
元素的属性值。-
<remote>
远程服务器的名字,<remote>
元素的<name>
元素,<project>
元素没有指定<name>
则使用该值。 -
<revision>
可以指定分支或者标签,如果<project>
元素里没有指定,就用这里的值。 -
<dest-branch>
Git分支的名称(例如master)。如果没有设置自己的目标分支的<project>
元素将继承此值。如果未设置此值,则项目将默认使用版本。 -
<upstream>
Git ref的名称,其中可以找到sha1。在-c模式下同步锁定修订manifests
时使用,以避免必须同步整个ref空间。未设置自身上游的项目元素将继承此值。 -
<sync-j>
repo sync
时默认并行的核数,等同于repo sync -j
。 -
<sync-c>
设置为 true 时,仅同步指定的 Git 分支,而不是整个 ref 空间。如果<project>
元素没有指定<sync-c>
元素,则使用此值。 -
<sync-s>
设置为true时,同时同步子项目。 -
<sync-tags>
将其设置为false,则只同步给定的Git分支(在revision属性中指定),而不同步其他ref标签。
-
-
<manifest-server>
它的url属性用于指定manifest服务的URL,通常是一个XML RPC 服务 -
<project>
单独Git 项目-
<name>
必填 项目的名称,用于和<remote>
元素下的<fetch>
元素值合成Git URL。 -
<path>
clone到本地的目录,如果没有指定则在<name>
元素值的文件夹下。 -
<remote>
远程服务器的名字,<remote>
元素的<name>
元素。 -
<revision>
指定分支或者标签,分支:refs/heads/master
,标签:refs/tags/tag
-
<dest-branch>
Git分支的名称(例如master)。 -
<groups>
列出<project>
所属的组,以空格或者逗号分隔多个组名。所有的<project>
都自动属于"all"组。每一个<project>
自动属于name:‘name’ 和path:'path’组。例如,它自动属于default, name:monkeys, and path:barrel-of组。如果一个project属于notdefault组,则,repo sync
时不会下载 -
<sync-c>
如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。 -
<sync-s>
如果设置为true,则会同步git的子项目 -
<upstream>
Git ref的名称,其中可以找到sha1。在-c模式下同步锁定修订manifests
时使用,以避免必须同步整个ref空间。 -
<clone-depth>
设置获取此项目使用的深度。如果已指定,此值将覆盖命令行中通过--depth
选项给repo init
指定值。[机器翻译] -
<force-path>
将此属性设置为 true 可强制此项目根据其路径属性(如果提供)而不是名称属性创建本地镜像存储库。此属性仅适用于本地镜像同步,在同步客户端工作目录中的项目时将忽略它。[机器翻译]
-
-
<extend-project>
修改已命名项目的属性。此元素在本地清单文件中最为有用,可以修改现有项目的属性而不必完全替换现有的项目定义。这使得本地清单更加健壮,不易受到原始清单更改的影响。[机器翻译]
-
<annotation>
一个项目元素可以指定零个或多个注释元素作为其子元素。每个元素描述了一个名称-值对,在“forall”命令期间,该名称-值对将带有REPO__前缀导出到每个项目的环境中。此外,还有一个可选属性“keep”,它接受不区分大小写的值“true”(默认值)或“false”。此属性确定在使用清单子命令导出时是否保留注释。[机器翻译] -
<copyfile>
项目元素可以指定零个或多个copyfile元素作为子元素。每个元素描述一个源文件和目标文件对;在repo同步命令执行期间,将“src”文件复制到“dest”位置。[机器翻译] -
<linkfile>
这就像是复制文件,并与复制文件同时运行,但它不复制文件,而是创建一个符号链接。符号链接在“dest”(相对于树的顶部)创建,并指向由“src”指定的路径,该路径是项目中的一个路径。
如果“dest”的父目录缺失,将自动创建。
符号链接的目标可以是一个文件或目录,但它不能指向存储库客户端之外的位置。[机器翻译]
-
<remove-project>
从内部的manifest
表中删除指定的<project>
。经常用于本地的manifest
文件,用户可以替换一个<project>
的定义 -
<include>
通过<name>
属性可以引入另外一个manifest
文件(路径相对与当前的manifest.xml 的路径)-
<name>
引入另外一个manifest
文件名
-
-
-
使用例子
Reference:https://www.cnblogs.com/helloworldtoyou/p/6430545.html
<?xml version="1.0" encoding="UTF-8"?> <manifest><remote name="github" // 远程服务器名称是“github”,后面用github表示fetchfetch=".." // 获取数据的位置是"..",上一级目录review="review.cyanogenmod.org" /> // gerrit审核的位置<remote name="private" // 远程服务器名称“private”fetch="ssh://git@github.com" /> // 从”ssh://git@github.com下载代码<remote name="aosp" // aospfetch="https://android.googlesource.com" // 代码下载地址review="android-review.googlesource.com"revision="refs/tags/android-7.1.1_r6" /> // 默认的git分支<default revision="refs/heads/cm-14.1" // 默认的代码下载地址remote="github" // github,表示上面的remote设置的name="github"的一项,那么下载的地址fetch就是”..“sync-c="true" // 只同步指定的分支sync-j="4" /> // repo sync 默认的并行数目// path:将代码下载到本地的build目录中 // name:${remote fetch}/${project name}.git // remote 没有指定,那么久采用default地址,name=github,从”.."上一层目录下载。 // 结合name的值,就从../CyanogenMod/android_build.git这个仓库下载地址。查看作者github仓库,就能找到android_build这个仓库。<project path="build" name="CyanogenMod/android_build" groups="pdk,tradefed"><copyfile src="core/root.mk" dest="Makefile" /></project><project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" remote="aosp" /><project path="build/kati" name="CyanogenMod/android_build_kati" groups="pdk,tradefed" /><project path="build/soong" name="platform/build/soong" groups="pdk,tradefed" remote="aosp" ><linkfile src="root.bp" dest="Android.bp" /><linkfile src="bootstrap.bash" dest="bootstrap.bash" /></project><project path="abi/cpp" name="platform/abi/cpp" groups="pdk" remote="aosp" /><project path="art" name="CyanogenMod/android_art" groups="pdk" /><project path="bionic" name="CyanogenMod/android_bionic" groups="pdk" />...
-
总结
对于
manifests
,方便了开发者在一个项目需要控制多个代码仓库对代码版本的控制,而且manifests
使用的xml
格式的文档,对于用户而言,上手简单。
https://gerrit.googlesource.com/git-repo/+/refs/heads/master/README.md
https://blog.csdn.net/wwwlyj123321/article/details/122361538