-
manifests是个啥- 在Repo中manifests描述了Repo客户端的结构,也就是可以从manifests中知道各个模块的代码应该从代码管理仓库当中哪个位置去获取。- manifests的基本结构是一个Git存储库,在顶层目录中持有一个default.xml文件。由于manifests保存在Git存储库中,在repo sync期间会同时将manifests的版本拉到最新 -
manifests格式<!DOCTYPEmanifest[<!ELEMENTmanifest(notice?,remote*,default?,manifest-server?,remove-project*,project*,extend-project*,repo-hooks?,include*)><!ELEMENTnotice(#PCDATA)><!ELEMENTremoteEMPTY><!ATTLISTremotenameID#REQUIRED><!ATTLISTremotealiasCDATA#IMPLIED><!ATTLISTremotefetchCDATA#REQUIRED><!ATTLISTremotepushurlCDATA#IMPLIED><!ATTLISTremotereviewCDATA#IMPLIED><!ATTLISTremoterevisionCDATA#IMPLIED><!ELEMENTdefaultEMPTY><!ATTLISTdefaultremoteIDREF#IMPLIED><!ATTLISTdefaultrevisionCDATA#IMPLIED><!ATTLISTdefaultdest-branchCDATA#IMPLIED><!ATTLISTdefaultupstreamCDATA#IMPLIED><!ATTLISTdefaultsync-jCDATA#IMPLIED><!ATTLISTdefaultsync-cCDATA#IMPLIED><!ATTLISTdefaultsync-sCDATA#IMPLIED><!ATTLISTdefaultsync-tagsCDATA#IMPLIED><!ELEMENTmanifest-serverEMPTY><!ATTLISTmanifest-serverurlCDATA#REQUIRED><!ELEMENTproject(annotation*,project*,copyfile*,linkfile*)><!ATTLISTprojectnameCDATA#REQUIRED><!ATTLISTprojectpathCDATA#IMPLIED><!ATTLISTprojectremoteIDREF#IMPLIED><!ATTLISTprojectrevisionCDATA#IMPLIED><!ATTLISTprojectdest-branchCDATA#IMPLIED><!ATTLISTprojectgroupsCDATA#IMPLIED><!ATTLISTprojectsync-cCDATA#IMPLIED><!ATTLISTprojectsync-sCDATA#IMPLIED><!ATTLISTprojectsync-tagsCDATA#IMPLIED><!ATTLISTprojectupstreamCDATA#IMPLIED><!ATTLISTprojectclone-depthCDATA#IMPLIED><!ATTLISTprojectforce-pathCDATA#IMPLIED><!ELEMENTannotationEMPTY><!ATTLISTannotationnameCDATA#REQUIRED><!ATTLISTannotationvalueCDATA#REQUIRED><!ATTLISTannotationkeepCDATA"true"><!ELEMENTcopyfileEMPTY><!ATTLISTcopyfilesrcCDATA#REQUIRED><!ATTLISTcopyfiledestCDATA#REQUIRED><!ELEMENTlinkfileEMPTY><!ATTLISTlinkfilesrcCDATA#REQUIRED><!ATTLISTlinkfiledestCDATA#REQUIRED><!ELEMENTextend-projectEMPTY><!ATTLISTextend-projectnameCDATA#REQUIRED><!ATTLISTextend-projectpathCDATA#IMPLIED><!ATTLISTextend-projectgroupsCDATA#IMPLIED><!ATTLISTextend-projectrevisionCDATA#IMPLIED><!ATTLISTextend-projectremoteCDATA#IMPLIED><!ELEMENTremove-projectEMPTY><!ATTLISTremove-projectnameCDATA#REQUIRED><!ELEMENTrepo-hooksEMPTY><!ATTLISTrepo-hooksin-projectCDATA#REQUIRED><!ATTLISTrepo-hooksenabled-listCDATA#REQUIRED><!ELEMENTincludeEMPTY><!ATTLISTincludenameCDATA#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表示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这个仓库。 <projectpath="build"name="CyanogenMod/android_build"groups="pdk,tradefed"><copyfilesrc="core/root.mk"dest="Makefile"/></project><projectpath="build/blueprint"name="platform/build/blueprint"groups="pdk,tradefed"remote="aosp"/><projectpath="build/kati"name="CyanogenMod/android_build_kati"groups="pdk,tradefed"/><projectpath="build/soong"name="platform/build/soong"groups="pdk,tradefed"remote="aosp"><linkfilesrc="root.bp"dest="Android.bp"/><linkfilesrc="bootstrap.bash"dest="bootstrap.bash"/></project><projectpath="abi/cpp"name="platform/abi/cpp"groups="pdk"remote="aosp"/><projectpath="art"name="CyanogenMod/android_art"groups="pdk"/><projectpath="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
标签:
git
本文转载自: https://blog.csdn.net/xiaokai1999/article/details/136871722
版权归原作者 锡城筱凯 所有, 如有侵权,请联系我们删除。
版权归原作者 锡城筱凯 所有, 如有侵权,请联系我们删除。