源文件: 0c957dd542b1476b34f3ad37736b06df38ea2fa8
repo清单格式
repo清单描述了repo客户端的结构;这是可见的目录,并且是git应该能够获取的目录。
清单的基本结构是一个裸Git存储库,但是在顶级目录中包含一个'default.xml'XML文件。
清单本身就是版本控制的,因为它们保存在Git存储库中。客户在repo sync
期间自动获取清单更新。
XML文件格式
清单XML文件(例如'default.xml')大致符合以下DTD:
<!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 default 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>
<!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
可以指定一个或多个远程元素。每个远程元素指定由一个或多个项目共享的Git URL,以及(可选)这些项目上载更改的Gerrit审阅服务器。
属性name
:此清单文件唯一的短名称。这里指定的名称在每个项目的.git / config中用作远程名称,因此可以自动用于git fetch
,git remote
,git pull
和git push
等命令。
属性alias
:别名,如果指定,用于覆盖name
,将其设置为每个项目中的远程名称.git / config. 它的值可以重复,而属性name
在清单中必须是唯一的文件。这有助于每个项目能够具有实际指向不同远程URL的相同远程名称。
属性fetch
:使用此远程的所有项目的Git URL前缀。每个项目的名称都附加到此前缀,以形成用于克隆项目的实际URL。
属性pushurl
:使用此远程的所有项目的Git“推送”URL前缀。每个项目的名称都附加到此前缀,以形成用于“git push”项目的实际URL。该属性是可选的;如果没有指定,那么“git push”将使用与fetch
属性相同的URL。
属性review
:Gerrit服务器的主机名,其中评论由repo upload
上传到。该属性是可选的;如果没有指定,那么repo upload
将不起作用。
属性revision
:Git分支的名称(例如master
或refs / heads / master
)。具有自己revision值的remote将覆盖default的revision值。
元素default
最多可以指定一个default元素。当项目元素未指定其自己的remote或revision属性时,将使用他的remote和version属性。
属性remote
:预先定义的remote元素的名称。缺少自己的远程属性的项目元素将使用此remote值。
属性revision
:Git分支的名称(例如master
或refs / heads / master
)。缺少自己的revision属性的项目元素将使用此值。
属性'dest-branch:Git分支的名称(例如
master)。不设置自己的
dest-branch的项目元素将继承此值。如果未设置此值,项目将默认使用
revision`。
属性upstream
:可以找到sha1的Git ref的名称。在-c模式下同步修订锁定清单时使用,以避免必须同步整个ref空间。不设置自己的upstream
的项目元素将继承此值。
属性sync-j
:同步时要使用的并行作业数。
属性sync-c
:设置为true以仅同步给定的Git分支(在revision
属性中指定)而不是整个ref空间。缺少自己的sync-c元素的项目元素将使用此值。
属性sync-s
:设置为true以同步子项目。
属性sync-tags
:设置为false以仅同步给定的Git分支(在revision
属性中指定)而不是其他ref标记。
元素 manifest-server
最多可以指定一个清单服务器。 url属性用于指定清单服务器的URL,该服务器是XML RPC服务。
清单服务器应该实现以下RPC方法:
GetApprovedManifest(branch,target)
返回一个清单,其中每个项目都与当前分支和目标的已知良好修订挂钩。当给出--smart-sync选项时,repo sync会使用此选项。
要使用的目标由环境变量TARGET_PRODUCT和TARGET_BUILD_VARIANT定义。这些变量用于创建$ TARGET_PRODUCT- $ TARGET_BUILD_VARIANT形式的字符串,例如,passion-userdebug。如果其中一个变量或两者都不存在,程序将调用不带目标参数的GetApprovedManifest,清单服务器应选择合理的默认目标。
GetManifest(tag)
返回一个清单,其中每个项目都与指定标记处的修订版挂钩。当给出--smart-tag选项时,repo sync会使用此选项。
元素 project
可以指定一个或多个项目元素。每个元素都描述了一个克隆到repo客户端工作区的Git存储库。您可以通过创建嵌套项目来指定Git子模块。 Git子模块将被自动识别并继承其父级属性,但这些属性可能会被显式指定的项目元素覆盖。
属性name
:此项目的唯一名称。项目的名称将附加到其远程的提取URL上,以生成用于配置Git远程的实际URL。 URL形成为:
${remote_fetch}/${PROJECT_NAME}.git
其中$ {remote_fetch}是远程的fetch属性,$ {project_name}是项目的name属性。始终附加后缀“.git”,因为repo假设上游是一个裸Git存储库。如果项目具有父元素,则其名称将以父元素为前缀。如果Gerrit用于代码审查,项目名称必须与Gerrit知道的名称相匹配。
属性path
:相对于repo客户端的顶级目录的可选路径,其中应放置此项目的Git工作目录。如果未提供,则使用项目名称。如果项目具有父元素,则其路径将以父元素为前缀。
属性remote
:先前定义的远程元素的名称。如果未提供,则使用默认元素给定的remote值。
属性revision
:清单要为此项目跟踪的Git分支的名称。名称可以是refs / heads(例如只是“master”)或绝对名称(例如“refs / heads / master”)。标签和/或显式SHA-1应该在理论上有效,但尚未经过广泛测试。如果未提供,则使用远程元素给出的version(如果适用),否则使用default中的值。
属性dest-branch
:Git分支的名称(例如master
)。使用repo upload
时,将提交更改以在此分支上进行代码审查。如果未在此处和default中指定,则使用revision
。
属性groups
:此项目所属的组列表,空格或逗号分隔。所有项目都属于“all”组,每个项目自动属于一个名称组:name
和path:path
。例如。对于<project name =“monkeys”path =“barrel-of”/>,该项目定义隐含在以下清单组中:default,name:monkeys和path:barrel-of。如果您将项目放入“notdefault”组中,则不会通过repo自动下载该项目。如果项目有父元素,那么name
和path
就是前缀。
属性sync-c
:设置为true以仅同步给定的Git分支(在revision
属性中指定)而不是整个ref空间。
属性sync-s
:设置为true以同步子项目。
属性upstream
:可以找到sha1的Git ref的名称。在-c模式下同步修订锁定清单时使用,以避免必须同步整个ref空间。
属性clone-depth
:设置获取此项目时使用的深度。如果指定,则此值将覆盖使用命令行上的--depth选项为repo init指定的任何值。
属性force-path
:设置为true以强制此项目根据其path
属性(如果提供)而不是name
属性创建本地镜像存储库。此属性仅适用于本地镜像同步,在同步客户端工作目录中的项目时将忽略该属性。
元素 extend-project
修改指定项目的属性。
此元素在本地清单文件中非常有用,可以在不完全替换现有项目定义的情况下修改现有项目的属性。这使得本地清单对原始清单的更改更加健壮。
属性path
:如果指定,则将更改限制为在指定路径检出的项目,而不是具有给定名称的所有项目。
属性groups
:此项目所属的其他组的列表。与project
的相应元素语法相同。
属性revision
:如果指定,则覆盖原始项目的修订版。与project
的相应元素语法相同。
元素 annotation
可以将零个或多个注释元素指定为项目元素的子元素。每个元素都描述了一个名称 - 值对,它将在'forall'命令期间导出到每个项目的环境中,前缀为REPO__。此外,还有一个可选属性“keep”,它接受不区分大小写的值“true”(默认值)或“false”。此属性确定在使用manifest子命令导出时是否保留注释。
元素copyfile
可以将零个或多个copyfile元素指定为项目元素的子元素。每个元素描述一对src-dest文件;在'repo sync'命令期间,“src”文件将被复制到“dest”位置。
“src”是项目相对的,“dest”是相对于树的顶部。
元素 linkfile
它就像copyfile一样,与copyfile同时运行,但不是复制它而是创建一个符号链接。
元素 remove-project
从内部清单表中删除命名项目,可能允许同一清单文件中的后续项目元素用不同的源替换项目。
此元素在本地清单文件中非常有用,用户可以在其中删除项目,并可能使用自己的定义替换它。
元素include
此元素提供将另一个清单文件包含到原始清单中的功能。正常规则适用于要包含的目标清单 - 它必须是一个可用的清单。
属性name
:要包含的清单,相对于清单存储库的根目录指定。
本地清单
可以通过存储在$ TOP_DIR/.repo/local_manifests/*.xml
中的本地清单文件添加其他远程和项目。
例如:
$ ls .repo/local_manifests
local_manifest.xml
another_local_manifest.xml
$ cat .repo/local_manifests/local_manifest.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<project path="manifest"
name="tools/manifest" />
<project path="platform-manifest"
name="platform/manifest" />
</manifest>
用户可以在“repo sync”调用之前将项目添加到本地清单,指示repo自动下载和管理这些额外项目。
存储在$ TOP_DIR/.repo/local_manifests/*.xml
中的清单文件将按字母顺序加载。
其他remote和project也可以通过本地清单添加,存储在$TOP_DIR/.repo/local_manifest.xml
中。不推荐使用此方法,而是使用上面提到的多个清单文件。
如果存在$TOP_DIR/.repo/local_manifest.xml
,它将在任何存储在$TOP_DIR/.repo/local_manifests /*.xml
中的清单文件之前加载。
来源:oschina
链接:https://my.oschina.net/u/195456/blog/1941064