[Repo Git] manifests的写法

  1. manifests​​是个啥

    • Repo​中manifests​描述了Repo客户端的结构,也就是可以从manifests​中知道各个模块的代码应该从代码管理仓库当中哪个位置去获取。

    • manifests​的基本结构是一个Git存储库,在顶层目录中持有一个default.xml​文件。

    由于manifests​保存在Git存储库中,在repo sync​期间会同时将manifests​的版本拉到最新

  2. 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​文件名
  3. 使用例子

    Reference:https://www.cnblogs.com/helloworldtoyou/p/6430545.html

    <?xml version="1.0" encoding="UTF-8"?>
    <manifest>
    
      <remote  name="github"						// 远程服务器名称是“github”,后面用github表示fetch
               fetch=".."							// 获取数据的位置是"..",上一级目录
               review="review.cyanogenmod.org" />	// gerrit审核的位置
    
      <remote  name="private"						// 远程服务器名称“private”
               fetch="ssh://git@github.com" />		// 从”ssh://git@github.com下载代码
    
      <remote  name="aosp"							// aosp
               fetch="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" />
      ...
    
  4. 总结

    对于 manifests​,方便了开发者在一个项目需要控制多个代码仓库对代码版本的控制,而且manifests​使用的xml​格式的文档,对于用户而言,上手简单。

https://gerrit.googlesource.com/git-repo/+/refs/heads/master/README.md

https://blog.csdn.net/wwwlyj123321/article/details/122361538

相关推荐

  1. WPF触发器多种写法

    2024-03-25 16:38:04       37 阅读
  2. [Repo Git] manifests写法

    2024-03-25 16:38:04       24 阅读
  3. Python模块导入写法

    2024-03-25 16:38:04       8 阅读
  4. 单例模式七种写法

    2024-03-25 16:38:04       41 阅读
  5. mapper xml中 <和>写法

    2024-03-25 16:38:04       35 阅读
  6. Rust CallBack几种写法

    2024-03-25 16:38:04       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-25 16:38:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-25 16:38:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-25 16:38:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-25 16:38:04       20 阅读

热门阅读

  1. 常用ES标准

    2024-03-25 16:38:04       19 阅读
  2. [leetcode] 26. 删除有序数组中的重复项

    2024-03-25 16:38:04       18 阅读
  3. String、StringBuilder、StringBuffer

    2024-03-25 16:38:04       15 阅读
  4. 【C语言】指针基础

    2024-03-25 16:38:04       19 阅读
  5. npm 常用命令详解

    2024-03-25 16:38:04       15 阅读
  6. 常用设计模式

    2024-03-25 16:38:04       17 阅读
  7. HTTP跨域

    2024-03-25 16:38:04       21 阅读
  8. Python问题异常处理与日志结合

    2024-03-25 16:38:04       20 阅读
  9. Python | 八、类型注解

    2024-03-25 16:38:04       15 阅读
  10. 链表去重介绍

    2024-03-25 16:38:04       16 阅读