repo manifest.xml

repo Manifest Format

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote name="aosp"         # 在每一个.git/config文件的remote项中用到这个name。remote "aosp"
          fetch="git+ssh://git@android.googlesource.com"          # 所有git url真正路径的前缀,所有git 的project name加上这个前缀,就是git url的真正路径。
          review="https://android-review.googlesource.com/"  # 指定Gerrit的服务器名,用于repo upload操作。如果没有指定,则repo upload没有效果。
          revision="refs/tags/android-7.1.1_r6"     # 默认的git分支。
          />  
  <remote name="ohd_pdk" fetch=".." />
  <remote name="trunk" fetch=".." />
    
  <default revision="refs/tags/android-11.0.0_r40"  #  所有git的默认branch,后面project没有特殊指出revision的话,就用这个branch。
           remote="aosp"    #  远程服务器的名字。 remote "aosp"
           sync-j="4"       #  在repo sync中默认并行的数目。
           />
    
  <manifest-server url="http://android-smartsync.corp.google.com/android.googlesource.com/manifestserver"  # manifest服务的URL。
                   />
  <superproject name="platform/superproject" remote="aosp"/>
  <contactinfo bugurl="go/repo-bug" />
    
  <include name="yocto.xml" />
  <include name="external.xml" />
  
   #  remote 没有指定,那么久采用default地址。下载项目到build/make下。
  <project name="platform/build"     # ${remote fetch}/${project name}.git   git@android.googlesource.com/platform/build.git
           path="build/make"         # clone到本地的git的工作目录,如果没有配置的话,跟name一样。
           revision="7ef04b2f41376f237f5d29e71c311f36b91b57d2"   # 指定需要获取的git提交点,可以定义成固定的branch,或者是明确的commit 哈希值
           upstream="refs/tags/android-11.0.0_r40"     # 在哪个git分支可以找到一个SHA1。
           dest-branch="refs/tags/android-11.0.0_r40"  # Git 分支的名称。
           groups="pdk"     # project所属的组,以空格或者逗号分隔多个组名。
           >
    <copyfile src="core/root.mk"  
              dest="Makefile"
              />
    <linkfile src="CleanSpec.mk" 
              dest="build/CleanSpec.mk"
              />
  </project>

  # 将代码下载到本地的build/blueprint目录,从remote="aosp“下载,也就是https://android.googlesource.com
  # 在结合project的name,下载的仓库地址就是https://android.googlesource.com/platform/build/blueprint.git
  <project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" remote="aosp" />
    
  <repo-hooks in-project="platform/tools/repohooks" enabled-list="pre-upload" />
</manifest>

Manifest解析

Element manifest

  • manifest:文件的根元素。

Element notice

  • 完成时向用户显示的任意文本repo sync。内容只是通过它存在于清单中。

Element remote

  • 属性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”将使用与属性相同的 URL fetch。
  • 属性review:上传到的 Gerrit 服务器的主机名repo upload。这个属性是可选的;如果未指定,repo upload则将不起作用。
  • 属性revision:Git 分支的名称(例如main或refs/heads/main)。具有自己版本的遥控器将覆盖默认版本。

Element default

  • 属性remote:先前定义的远程元素的名称。缺少自己的远程属性的项目元素将使用此远程。
  • 属性revision:Git 分支的名称(例如main或refs/heads/main)。缺少自己的修订属性的项目元素将使用此修订。
  • 属性dest-branch:Git 分支的名称(例如main)。未设置自己的项目元素dest-branch将继承此值。如果未设置此值,项目将revision默认使用。
  • 属性upstream:可以在其中找到 sha1 的 Git 引用的名称。在 -c 模式下同步修订锁定清单时使用,以避免必须同步整个引用空间。未设置自己的项目元素upstream将继承此值。
  • 属性sync-j:同步时要使用的并行作业数。
  • 属性sync-c:设置为 true 以仅同步给定的 Git 分支(在revision属性中指定)而不是整个引用空间。缺少自己的 sync-c 元素的项目元素将使用此值。
  • 属性sync-s:设置为 true 也同步子项目。
  • 属性sync-tags:设置为 false 以仅同步给定的 Git 分支(在属性中指定revision)而不是其他 ref 标记。

Element 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 使用它。

Element submanifest

  • 属性name:此子清单的唯一名称(在当前(子)清单中)。它作为revision下面的默认值。相同的名称可用于具有不同父(子)清单的子清单。
  • 属性remote:先前定义的远程元素的名称。如果未提供,则使用默认元素给出的远程。
  • 属性project:清单项目名称。项目的名称附加到其远程的获取 URL 以生成实际的 URL 来配置 Git 远程。URL 的格式如下:
    • ${remote_fetch}/${project_name}.git
    • 其中 ${remote_fetch} 是远程的 fetch 属性,${project_name} 是项目的名称属性。总是附加后缀“.git”,因为 repo 假定上游是一个裸 Git 存储库的森林。如果项目有父元素,其名称将以父元素为前缀。
    • 如果 Gerrit 用于代码审查,项目名称必须与 Gerrit 知道的名称相匹配。
    • project不能为空,不能是绝对路径或使用“.” 或“..”路径组件。它总是相对于遥控器的获取设置进行解释,因此如果需要不同的基本路径,请使用所需的新设置声明一个不同的遥控器。
    • 如果未提供,将使用此清单的远程和项目:remote无法提供。
    • 来自子清单的项目及其子清单被添加到 submanifest::path:<path_prefix> 组。
  • 属性manifest-name:清单项目中的清单文件名。如果未提供,default.xml则使用。
  • 属性revision:Git 分支的名称(例如“main”或“refs/heads/main”)、标签(例如“refs/tags/stable”)或提交哈希。如果未提供,name则使用。
  • 属性path:相对于 repo 客户端顶级目录的可选路径,子清单 repo 客户端顶级目录应放置在该目录中。如果未提供,revision则使用。path可能不是绝对路径或使用“.” 或“..”路径组件。
  • 属性groups:包含的子清单中的所有项目所属的附加组的列表。这会追加和递归,这意味着子清单中的所有项目都带有所有父子清单组。与 的相应元素相同的语法project。
  • 属性default-groups:如果在初始化时未指定参数,则要同步的清单组列表--groups=。当该列表为空时,使用此列表而不是“默认”作为要同步的组列表。

Element project

可以指定一个或多个项目元素。每个元素都描述了一个要克隆到 repo 客户端工作区中的 Git 存储库。您可以通过创建嵌套项目来指定 Git-submodules。Git 子模块将被自动识别并继承其父模块的属性,但这些模块可能会被明确指定的项目元素覆盖。

  • 属性name:此项目的唯一名称。项目的名称附加到其远程的获取 URL 以生成实际的 URL 来配置 Git 远程。URL 的格式如下:
    • ${remote_fetch}/${project_name}.git
    • 其中 ${remote_fetch} 是远程的 fetch 属性,${project_name} 是项目的名称属性。总是附加后缀“.git”,因为 repo 假定上游是一个裸 Git 存储库的森林。如果项目有父元素,其名称将以父元素为前缀。
    • 如果 Gerrit 用于代码审查,项目名称必须与 Gerrit 知道的名称相匹配。“名称”不能为空,也不能是绝对路径或使用“.”。或“..”路径组件。它总是相对于遥控器的获取设置进行解释,因此如果需要不同的基本路径,请使用所需的新设置声明一个不同的遥控器。不对Local Manifests强制执行这些限制。
    • 属性path:相对于 repo 客户端顶层目录的可选路径,该项目的 Git 工作目录应放置在该目录中。如果未提供,则使用项目“名称”。如果项目有父元素,其路径将以父元素为前缀。“路径”可能不是绝对路径或使用“.” 或“..”路径组件。不对Local Manifests强制执行这些限制。
    • 如果您想将文件放入结帐的根目录(例如 README 或 Makefile 或其他构建脚本),请改用 copyfile或linkfile元素。
  • 属性remote:先前定义的远程元素的名称。如果未提供,则使用默认元素给出的远程。
  • 属性revision:清单要为此项目跟踪的 Git 分支的名称。名称可以相对于 refs/heads(例如“main”)或绝对的(例如“refs/heads/main”)。标签和/或显式 SHA-1 在理论上应该有效,但尚未经过广泛测试。如果未提供,则使用远程元素给出的修订版(如果适用),否则使用默认元素。
  • 属性dest-branch:Git 分支的名称(例如main)。使用时repo upload,更改将提交到该分支进行代码审查。如果在此处和默认元素中均未指定,revision则使用。
  • 属性groups:该项目所属的组列表,以空格或逗号分隔。所有项目都属于“all”组,每个项目自动属于一组名称:name和路径:path。例如<project name="monkeys" path="barrel-of"/>,该项目定义隐含在以下清单组中:default、name:monkeys 和 path:barrel-of。如果你将一个项目放在“notdefault”组中,它不会被 repo 自动下载。如果项目有父元素,则name和path此处是前缀元素。
  • 属性sync-c:设置为 true 以仅同步给定的 Git 分支(在revision属性中指定)而不是整个引用空间。
  • 属性sync-s:设置为 true 也同步子项目。
  • 属性upstream:可以在其中找到 sha1 的 Git 引用的名称。在 -c 模式下同步修订锁定清单时使用,以避免必须同步整个引用空间。
  • 属性clone-depth:设置获取此项目时要使用的深度。如果指定,此值将覆盖在命令行上使用 --depth 选项提供给 repo init 的任何值。
  • 属性force-path:设置为 true 以强制此项目根据其path属性(如果提供)而不是name属性创建本地镜像存储库。此属性仅适用于本地镜像同步,在客户端工作目录中同步项目时将被忽略。

Element extend-project

修改命名项目的属性。 此元素在本地清单文件中最有用,可在不完全替换现有项目定义的情况下修改现有项目的属性。这使得本地清单对原始清单的更改更加健壮。

  • 属性path:如果指定,则将更改限制为在指定路径签出的项目,而不是具有给定名称的所有项目。
  • 属性dest-path:如果指定,则为相对于 repo 客户端顶层目录的路径,该目录应放置此项目的 Git 工作目录。这用于通过覆盖现有path设置来移动结帐中的项目。
  • 属性groups:此项目所属的其他组的列表。与 的相应元素相同的语法project。
  • 属性revision:如果指定,将覆盖原始项目的修订版。与 的相应元素相同的语法project。
  • 属性remote:如果指定,则覆盖原始项目的远程。与 的相应元素相同的语法project。
  • 属性dest-branch:如果指定,将覆盖原始项目的目标分支。与 的相应元素相同的语法project。
  • 属性upstream:如果指定,则覆盖原始项目的上游。与 的相应元素相同的语法project。

Element annotation

  • 可以将零个或多个注释元素指定为项目或远程元素的子元素。每个元素描述一个名称-值对。对于项目,此名称-值对将在“forall”命令期间导出到每个项目的环境中,前缀为REPO__. 此外,还有一个可选属性“keep”,它接受不区分大小写的值“true”(默认)或“false”。此属性确定在使用 manifest 子命令导出时是否保留注释。

Element copyfile

  • 可以将零个或多个 copyfile 元素指定为项目元素的子元素。每个元素描述一对 src-dest 文件;“src”文件将在repo sync命令期间被复制到“dest”位置。
  • “src”是相对于项目的,“dest”是相对于树的顶部的。不允许从项目外部的路径复制或复制到 repo 客户端外部的路径。
  • “src”和“dest”必须是文件。目录或符号链接是不允许的。中间路径也不能是符号链接。
  • 如果缺少,将自动创建“dest”的父目录。

Element linkfile

  • 它就像 copyfile 一样,与 copyfile 同时运行,但它不是复制而是创建一个符号链接。
  • 符号链接在“dest”(相对于树的顶部)创建,并指向“src”指定的路径,这是项目中的路径。
  • 如果缺少,将自动创建“dest”的父目录。
  • 符号链接目标可以是文件或目录,但它不能指向 repo 客户端之外。

Element remove-project

  • 从内部清单表中删除命名项目,可能允许同一清单文件中的后续项目元素用不同的源替换项目。
  • 此元素在本地清单文件中最有用,用户可以在其中删除项目,并可能用自己的定义替换它。
  • 属性optional:设置为 true 以忽略没有匹配project元素的 remove-project 元素。

Element repo-hooks

一次只能指定一个 repo-hooks 元素。

  • 属性in-project:定义repo-hooks 的项目。该值必须与先前定义的元素的name属性(而不是属性path)相匹配project。
  • 属性enabled-list:要使用的repo-hooks 列表,以空格或逗号分隔。

Element superproject

  • 属性name:超级项目的唯一名称。该属性与项目的名称属性含义相同。
  • 属性remote:先前定义的远程元素的名称。如果未提供,则使用默认元素给出的远程。
  • 属性revision:清单要为此超级项目跟踪的 Git 分支的名称。如果未提供,则使用远程元素给出的修订版(如果适用),否则使用默认元素。

Element contactinfo

此元素用于让清单作者自行注册联系信息。它具有“bugurl”作为必需的属性。这个元素可以重复,任何后面的条目都会破坏前面的条目。这将允许扩展清单的清单作者指定他们自己的联系信息。

  • 属性bugurl:针对清单所有者提交错误的 URL。

Element include

此元素提供将另一个清单文件包含到原始清单中的功能。正常规则适用于要包含的目标清单 - 它必须是一个可用的清单。

  • 属性name:要包含的清单,相对于清单存储库的根指定。“名称”可以不是绝对路径或使用“.” 或“..”路径组件。不对Local Manifests强制执行这些限制。
  • 属性groups:包含的清单中的所有项目所属的附加组的列表。这会追加和递归,这意味着包含清单中的所有项目都带有所有父包含组。与 的相应元素相同的语法project。

参考文档

https://github.com/GerritCodeReview/git-repo/blob/main/docs/manifest-format.md

posted @ 2023-03-06 18:01  小吉猫  阅读(1506)  评论(0编辑  收藏  举报