LV03-repo-04-xml文件说明
本文主要是使用repo——xml文件说明的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
PC端开发环境 | Windows | Windows11 |
Ubuntu | Ubuntu20.04.2的64位版本 | |
VMware® Workstation 17 Pro | 17.6.0 build-24238078 | |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) | |
Win32DiskImager | Win32DiskImager v1.0 | |
Linux开发板环境 | Linux开发板 | 正点原子 i.MX6ULL Linux 阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) | |
linux内核 | linux-4.15(NXP官方提供) |
点击查看本文参考资料
参考资料 | 相关说明 |
Git 官网 | https://git-scm.com/ |
Git 官方文档 | https://git-scm.com/doc |
Pro Git Book | https://git-scm.com/book/zh/v2 |
Git 快速使用指南 | https://training.github.com/downloads/zh_CN/github-git-cheat-sheet/ |
Visual Git Cheat Sheet | https://ndpsoftware.com/git-cheatsheet.html#loc=index |
Repo 工具使用介绍 - Gitee.com | https://gitee.com/help/articles/4316#article-header0 |
点击查看相关文件下载
分类 | 网址 | 说明 |
--- | --- | --- |
这一篇其实可以查看repo源码仓库中docs/manifest-format.md(docs/manifest-format.md · 开源中国/repo - 码云 - 开源中国 (gitee.com))
一、xml文件示例
也可以参考OpenHarmony-SIG/manifest中的 devboard_niobeu4.xml · OpenHarmony-SIG/manifest - Gitee.com
1. 安卓源码的default.xml
这里写个笔记总结记录一下xml文件中关键的几个参数。这里是以安卓源码中的default.xml为例:
1 |
|
后面我们详细学习一下。
2. 主要结构
2.1 manifest
<manifest>
标签:用于标识整个xml配置文件的开始和结束。
1 |
|
这个是配置的顶层元素,即根标志。
2.2 remote
<remote>
标签:用于指定远程仓库的信息。可以指定一个或多个远程元素。每个远程元素指定一个Git URL。
1 |
|
(1)name:在每一个.git/config文件的remote项中用到这个name,即表示每个git的远程服务器的名字(这个名字很关键,如果多个remote属性的话,default属性中需要指定default remote)。git pull、get fetch的时候会用到这个remote name。一个项目清单中的代码可以来自不同服务器,所以remote元素可以有多个,用于存在多个git远程服务器的情况。就比如我们创建好本地版本库的时候要和远程仓库建立连接,我们会用以下命令:
1 | git remote add origin git@github.com:sumumm/git-example.git |
这里的origin就相当于这里的name。
(2)alias :远程git服务器的别名,如果指定了,则会覆盖name的设定。在一个manifest中,name不能重名,但alias可以重名,可以用来指向不同的remote url。当有多个remote时,远程仓库名称会不一样,为了保持远程仓库名称相同便于管理,可以通过该变量为仓库取别名。通常name不为origin时,可以将别名取为origin。
(3)fetch :所有git url真正路径的前缀,所有git 的project name(就是后面的project标签的name元素)加上这个前缀,就是git url的真正路径。如果使用此remote的所有项目的前缀和manifest仓库前置一致的话,可以使用...
代替。注意不包含仓库名。
(4)pushurl:设置git push 使用的url地址, fetch 和 push 可以是2个不同的url。
(5)review :指定Git的服务器名,用于repo upload(上传所有仓库的提交记录到服务器)。如果没有指定,则repo upload没有效果。通常跟fetch变量保持一致即可。
(6)revision:git分支的名字,例如master或者refs/heads/master。
2.3 default
<default>
标签:用于指定project标签的默认参数。如果在project元素里没有指定一个属性,则使用default元素的属性值。需要注意的是default元素只能有一个。
1 |
(1)remote :为<project>
标签中的remote
属性指定默认值。其实就是之前定义的某一个<remote>
标签中name属性值,用于指定使用哪一个远程git服务器。(上面remote属性中提到过,多个remote的时候需要指定default remote,就是这里设置了)。
(2)revision :指定默认需要获取的git提交点,可以是master, refs/heads/master, tag或者某次提交的哈希字符串值。如果不设置的话,默认下载当前project,默认分支上的最新代码。
(3)sync_j : 在repo sync中默认并行的数目。
(4)sync_c :如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容
(5)sync_s : 如果设置为true,则会同步git的子项目
(6)sync-tags: 控制是否下载tags标签
2.4 project
<project>
标签:用于指定具体仓库的名称、存储路径,远程仓库名称、分支等单个仓库下载所需的信息。就是指定一个需要clone的git仓库。
1 |
|
(1)name :仓库的名称,与<remote>
标签中指定的fetch
远程仓库的路径前缀拼接,形成完整代码下载地址(git url)。URL格式是:${remote fetch}/${project name}.git
其中的 fetch就是上面提到的remote 中的fetch元素。
(2)path :仓库定git clone下载下来后代码在本地保存的路径(我自己理解就是下载下来后的目录名,可以与远程仓库不同的)。如果没有指定,则以name作为子目录名。
(3)remote :指定远程仓库<remote>
标签中的name,从而获取其仓库下载地址前缀。如果没有定义的话就用default中定义的remote name。如果想要管理不同的git服务器上的仓库,那么这里就必须要指定使用哪一个remote name。
(4)revision :指定代码下载的提交点,可以是分支master, refs/heads/master、 tag(tag的话不能只写tag名称,要写成refs/tags/tag_name)或者明确的commit 哈希值(根据后面的测试,这里必须要是完整的那一个哈希值)。
(5)groups :列出project所属的组,以空格或者逗号分隔多个组名。所有的project都自动属于”all”组。每一个project自动属于name:'name'
和path:'path'
组。例如<project name="monkeys" path="barrel-of"/>
,它自动属于default, name:monkeys, and path:barrel-of组。如果一个project属于notdefault组,则,repo sync时不会下载。
(6)sync_c :如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
(7)sync_s : 如果设置为true,则会同步git的子项目.
(8)upstream :在哪个git分支可以找到一个SHA1。用于同步revision锁定的manifest(-c 模式)。该模式可以避免同步整个ref空间
(9)annotation :可以有0个或多个annotation,格式是name-value,repo forall命令是会用来定义环境变量。
(10)clone-depth:该设置获取此项目时要使用的深度,相当于git clone –depth参数。
注意:必须包含 name 和 path 属性,name 用于指定远程仓库位置,path 指定下载后的代码相对路径。
2.5 manifest-server
它的url属性用于指定manifest服务的URL,通常是一个XML RPC 服务。它要支持以下RPC方法:
(1)GetApprovedManifest(branch, target) :返回一个manifest用于指示所有projects的分支和编译目标。target参数来自环境变量TARGET_PRODUCT和TARGET_BUILD_VARIANT,组成$TARGET_PRODUCT-$TARGET_BUILD_VARIANT
(2)GetManifest(tag) :返回指定tag的manifest
2.6 include
1 |
通过name属性可以引入另外一个manifest文件(路径相对与当前的manifest.xml 的路径)。
name :另一个需要导入的manifest文件名字。可以在当前的路径下添加一个another_manifest.xml,这样可以在另一个xml中添加或删除project。
2.7 remove-project
1 |
从内部的manifest表中删除指定的project。经常用于本地的manifest文件,用户可以替换一个project的定义。
2.8 copyfile
1 |
project元素的子元素,每个元素描述了一对 src-dest 文件对。
- src: 是相对于project标签的path属性值的相对路径。
- dest: 是相对于当前目录(执行repo init和repo sync命令的目录)的路径。
可以将零个或多个copyfile元素指定为项目元素的子元素。每个元素描述一个src-dest文件对;在repo sync命令中,src文件将被复制到dest位置。通常会被用于 README 或 Makefile 或其他构建脚本。
“src”和“dest”必须是文件。不允许使用目录或符号链接。中间路径也不能是符号链接。如果缺少“dest”的父目录,将自动创建。
2.9 linkfile
<linkfile>
标签:用于创建软连接文件,是<project>
标签的子元素,需要写在<project>
与</project>
之间。
1 |
project 的子节点属性。它就像copyfile一样,与copyfile同时运行,但它不是复制,而是创建一个符号链接。符号链接在“dest”(相对于树的顶部)创建,并指向由“src”指定的路径,这是项目中的路径。如果缺少“dest”的父目录,将自动创建。符号链接的目标可以是一个文件或目录,但它不能指向repo客户端之外。
- dest属性:软链接生成的路径
- src属性:软链接链接的文件所在路径
3. 一张图掌握?
二、实例分析
1. 拉取最新版本仓库
1.1 清单库文件
我使用自己之前创建的清单库:repo-manifest: repo的清单库 - Gitee.com。修改清单库文件如下:
1 |
|
这里将会clone两个仓库:
1 | git@gitee.com:sumumm/git-example.git |
1.2 初始化repo管理目录
我们修改后提交代码然后执行以下命令初始化一个repo管理目录:
1 | repo --trace init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --repo-rev= -u https://gitee.com/sumumm/repo-manifest.git -b master -m repo-demo.xml |
然后我们就会得到这些文件:
接下来我们clone出所有的仓库:
1 | repo sync |
然后就会clone出我们指定的两个仓库:
1.3 对比提交记录
我们来看一下两个仓库的提交记录,会发现默认都是拉取的最新版本:
- openssl.git
- git-example.git
1.4 看一下远程仓库?
我们下载下来的仓库应该是对应了远程仓库的,我们执行以下命令看一下:
1 | git remote -v |
可以看到,每一个本地仓库为远程仓库取的名字都叫sumu-gitee。
2. 加一个gitee仓库
我们加一个其他的gitee的开源库:repo: Repo 是一个用于批量管理多仓库工程的工具,本仓库主要对 repo 做了二次开发,使其支持 Gitee Fork+PullRequest 流程
1 | git@gitee.com:oschina/repo.git |
2.1 remote name相同会怎样?
清单库文件看这里:repo-manifest: repo的清单库 - Gitee.com
1 |
|
这个情况属于remote中name重复,我们可以直接执行下面的命令:
1 | repo --trace init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --repo-rev= -u https://gitee.com/sumumm/repo-manifest.git -b master -m repo-demo.xml |
不出意外的话肯定报错:
2.2 remote name不同的情况
清单库文件看这里:repo-manifest: repo的清单库 - Gitee.com
1 |
|
注意这个时候就需要为不同的仓库地址指定remote名字和revision分支了,因为这里默认写的master分支,但是repo那个仓库默认是main分支。我们修改如下(repo-manifest: repo的清单库 - Gitee.com):
1 |
|
然后我们可以正常下载,但是吧就是用repo这命令的话对于其他人的仓库貌似不能用ssh地址,会报错:
所以这里还要修改为https链接,清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com
1 |
|
我们执行以下命令:
1 | repo init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --repo-rev= -u https://gitee.com/sumumm/repo-manifest.git -b master -m repo-demo.xml |
这个时候就可以了。我们用以下命令看一下三个仓库的远程仓库名:
1 | git remote -v |
会发现和每个仓库指定的remote名字一样。
3. alias的使用
上一个实验做完,我们可以添加别人的仓库了,但是吧,就是每个仓库远程分支别名都是使用的不一样的名字,我们能不能搞成一样的?就跟平时使用git的时候一样,全部用origin?当然也可以啦,这个时候就需要使用remote标签的alias属性了。
3.1 清单库文件
清单库文件看这里repo-manifest: repo的清单库 - Gitee.com:
1 |
|
需要注意的是,必须要有一个remote标签的name为origin,否则会报这个:
另外需要注意,这里还是需要为https://gitee.com/oschina/repo.git
指定remote name。
3.2 初始化repo管理目录
我们执行以下命令:
1 | repo --trace init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --repo-rev= -u https://gitee.com/sumumm/repo-manifest.git -b master -m repo-demo.xml |
3.3 看一下远程仓库?
我们执行:
1 | git remote -v |
这样每个远程仓库链接的别名就都一样了。
4. 拉取指定版本
4.1 清单库文件
清单库文件看这里:repo-manifest: repo的清单库 - Gitee.com
1 |
|
我这里指定openssl仓库的版本为1a7ff22。
需要注意的是这里不能写简写1a7ff22, 要写完整的commid id:1a7ff22884d28ab7efba583a9d6cc7627b5f42a6,否则就可能会出现报错:
4.2 初始化repo管理目录
执行以下命令:
1 | repo init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --repo-rev= -u https://gitee.com/sumumm/repo-manifest.git -b master -m repo-demo.xml |
4.3 看一下提交记录
当成功拉取分支和版本后,我们看一下这个本地的openssl仓库的提交记录:
可以发现最新版本已经在1a7ff22这里了。
5. 拉取不同服务器仓库
这个跟添加一个服务器一样的,清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com
1 |
|
6. 拉取指定分支
6.1 创建一个分支
我们在之前的gitee仓库中多创建一个测试分支:
6.2 清单库
清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com
1 |
|
6.3 初始化repo管理目录
1 | repo init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --repo-rev= -u https://gitee.com/sumumm/repo-manifest.git -b master -m repo-demo.xml |
6.4 看一下提交记录
就会看到这里其实获取的已经是repo-demo分支的了:
我们执行下面的命令:
1 | git branch -a |
就可以看到整个仓库所有分支和当前的分支。
7. 指定clone的深度
对于有一个仓库,比如我后面会学习的uboot:nxp-imx/uboot-imx at rel_imx_4.1.15_2.1.0_ga (github.com)
这样我们完全clone下来的话会很占地,而且会clone很久,我们手动使用git clone的时候,有一个–depth选项可以用,repo中也是支持的。我们这里还需要指定tag,固定一下版本:Release rel_imx_4.1.15_2.1.0_ga: MLK-14707 fsl_esdhc: Fix eMMC 1.8v setting issue · nxp-imx/uboot-imx (github.com):
7.1 清单库
清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com
1 |
|
这样直接写标签的话好像报错了(后来发现实际是因为tag的格式写的不对,可以看第8个例子):
后面还是根据标签找到提交记录:
然后直接拉取这个提交记录了。清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com
7.2 初始化repo管理目录
1 | repo init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --repo-rev= -u https://gitee.com/sumumm/repo-manifest.git -b master -m repo-demo.xml |
7.3 查看uboot的提交记录
会发现只有一次提交,就是我们上面tag对应的a57b13b942d59719e3621179e98bd8a0ab235088。
8. 指定tag
8.1 创建一个tag
前面不是写tag的时候失败了,这里不知道是不是那个仓库的问题,我们还是以这个仓库为例git-example: 学习Git的时候的测试仓库 (gitee.com):
这里我们在这个仓库创建一个tag:
1 | git clone git@gitee.com:sumumm/git-example.git |
我们在这里创建一个tag:
1 | git tag V2023_06_23_10_06_53-release f5a3adf |
然后推送到远程仓库:
1 | git push origin --tags # 推送所有的tags |
然后我们看一下gitee仓库:
8.2 清单库
清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com
8.3 初始化repo管理目录
1 | repo init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo --repo-rev= -u https://gitee.com/sumumm/repo-manifest.git -b master -m repo-demo.xml |
这里执行repo sync的时候直接就报错了:
可以试一下直接git clone:
1 | git clone -b V2023_06_23_10_06_53-release git@gitee.com:sumumm/git-example.git |
发现我们的tag是存在的。那肯定还是哪里配置不对,后来搜索资料发现,使用tag的时候不能直接写tag名,要加上refs/tags/
。
8.4 更新清单库文件
后来发现,其实是因为tag的时候不能只写tag名,要这样写:
1 | refs/tags/tag_name |
所以这里更新一下清单库:repo-manifest: repo的清单库 - Gitee.com
1 |
|
然后重新执行对应的创建以及同步命令之后,就会发现正常拉取了分支了。
8.5 看一下提交记录
我们看一下git-example-local的提交记录:
会发现就处于f5a3adf这次提交啦。