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官方提供)
点击查看本文参考资料
点击查看相关文件下载
分类 网址 说明
--- --- ---

这一篇其实可以查看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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<!--
remote:标签指定远程仓库的名字,
fetch :是所有git url真正路径的前缀,所有 git 的 project name加上这个前缀,就是 git url的真正路径;
review:指定Gerrit 的服务器名,用于repo upload操作
-->
<remote name="aosp"
fetch=".."
review="https://android-review.googlesource.com/" />

<!--
default:标签设定所有projects的默认属性值,如果在project元素里没有指定一个属性,则使用 default 元素的属性值
-->

<default revision="refs/tags/android-10.0.0_r45"
remote="aosp"
sync-j="4" />

<!-- project
name : git 的名称,用户生成git url. URL格式是: ${remote fetch}/${project name}.git 其中的fetch就是上面remote中的fetch元素.name 就是此处的name;
path : clone 到本地的git的工作目录,如果没有配置,跟name一样;
remote: 定义remote name, 如果没有定义的话,就用default中定义的remote name;
reversion: 指定需要获取的git提交点,可以定义成固定的branch,或者是明确的commit的哈希值;
groups: 列出project所属的组,以空格或者逗号分隔多个组名.所有的project都自动属于"all"组.
-->

<project path="build/make" name="platform/build" groups="pdk" >
<copyfile src="core/root.mk" dest="Makefile" />
<linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />
<linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" />
<linkfile src="core" dest="build/core" />
<linkfile src="envsetup.sh" dest="build/envsetup.sh" />
<linkfile src="target" dest="build/target" />

<!-- src 表示在build/make/tools目录, dest表示本地路径build/tools软件链接文件链接到src
-->

<linkfile src="tools" dest="build/tools" />
</project>
<project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" />
<project path="build/kati" name="platform/build/kati" groups="pdk,tradefed" />
<project path="build/soong" name="platform/build/soong" groups="pdk,tradefed" >
<linkfile src="root.bp" dest="Android.bp" />
<linkfile src="bootstrap.bash" dest="bootstrap.bash" />
</project>
<project path="tools/trebuchet" name="platform/tools/trebuchet" groups="tools,cts,pdk,pdk-cw-fs,pdk-fs" />
<!-- ...... -->
<repo-hooks in-project="platform/tools/repohooks" enabled-list="pre-upload" />

</manifest>

后面我们详细学习一下。

2. 主要结构

2.1 manifest

<manifest> 标签:用于标识整个xml配置文件的开始和结束。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>


可以包含的子元素
<!DOCTYPE manifest [
<!ELEMENT manifest (notice?,
remote*,
default?,
manifest-server?,
remove-project*,
project*,
extend-project*,
repo-hooks?,
include*)>

这个是配置的顶层元素,即根标志。

2.2 remote

<remote> 标签:用于指定远程仓库的信息。可以指定一个或多个远程元素。每个远程元素指定一个Git URL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  <!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>

例子1:
<remote fetch=".." name="zsgit" review="gerrit.xxxxx.com"/>

例子2:
<remote fetch="ssh://gerrit-sw.example.com:20418/" name="gerrit_01" review="gerrit.xxxxx.com"/>
<remote fetch="ssh://gerrit-os.example.com:20418/" name="gerrit_02" review="gerrit.xxxxx.com"/>

(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
2
3
4
5
6
7
8
9
<!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>

(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  <!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>

<project groups="zs_amss" name="AMSS/adsp_proc" path="AMSS/adsp_proc" />

(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
2
<!ELEMENT include EMPTY>
<!ATTLIST include name CDATA #REQUIRED>

通过name属性可以引入另外一个manifest文件(路径相对与当前的manifest.xml 的路径)。

name :另一个需要导入的manifest文件名字。可以在当前的路径下添加一个another_manifest.xml,这样可以在另一个xml中添加或删除project。

2.7 remove-project

1
2
<!ELEMENT remove-project EMPTY>
<!ATTLIST remove-project name CDATA #REQUIRED>

从内部的manifest表中删除指定的project。经常用于本地的manifest文件,用户可以替换一个project的定义。

2.8 copyfile

1
2
3
<!ELEMENT copyfile EMPTY>
<!ATTLIST copyfile src CDATA #REQUIRED>
<!ATTLIST copyfile dest CDATA #REQUIRED>

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
2
3
<!ELEMENT linkfile EMPTY>
<!ATTLIST linkfile src CDATA #REQUIRED>
<!ATTLIST linkfile dest CDATA #REQUIRED>

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

  • dest属性:软链接生成的路径
  • src属性:软链接链接的文件所在路径

3. 一张图掌握?

repo的清单文件和目录结构

二、实例分析

1. 拉取最新版本仓库

1.1 清单库文件

我使用自己之前创建的清单库:repo-manifest: repo的清单库 - Gitee.com。修改清单库文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<!-- remote 指定远程仓库的信息 -->
<!-- name 标志该仓库的远程名称,与<project>标签中的remote属性需要对应起来。 -->
<!-- fetch 用于指定远程仓库的路径前缀(注意不包含仓库名)。 -->
<!-- alias 由于下载代码时是通过远程仓库名remote来确定下载路径前缀的,当有多个remote时,远程仓库名称会不一样,
为了保持远程仓库名称相同便于管理,可以通过该变量为仓库取别名。通常name不为origin时,可以将别名取为 origin -->
<!-- review 指定Git的服务器名,用于repo upload操作。如果没有指定,则repo upload没有效果。通常跟fetch变量保持一致即可。-->
<remote name="sumu-gitee"
fetch="git@gitee.com:sumumm"
autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/sumumm/manifest/blob/master/default.xml -->

<!-- default 用于指定project标签的默认参数 -->
<!-- remote 为<project>标签中的remote属性指定默认值, 若之后project中不指定,则默认为default中指定的。 -->
<!-- revision 指定默认需要获取的git提交点,可以是master, refs/heads/master, tag或者某次提交的哈希字符串值。
如果不设置的话,默认下载当前project,默认分支上的最新代码。 -->
<!-- sync-j 代码同步时线程数 -->
<default revision="master"
remote="sumu-gitee" />

<!-- project 用于指定具体仓库的名称、存储路径,远程仓库名称、分支等单个仓库下载所需的信息。 -->
<!-- name 仓库的名称,与<remote>标签中指定的fetch远程仓库的路径前缀拼接,形成完整代码下载地址。 -->
<!-- path 仓库下载下来后代码在本地保存的路径。如果没有指定,则以name作为子目录名。 -->
<!-- revision 指定代码下载的提交点,可以是分支、tag或某次提交的哈希字符串值。 -->
<!-- remote 指定远程仓库<remote>标签中的name,从而获取其仓库下载地址前缀。 -->
<!-- git@gitee.com:sumumm/git-example -->
<project path="git-example-local" name="git-example" /> <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
<!-- git@gitee.com:sumumm/openssl.git -->
<project path="openssl--local" name="openssl" /> <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
</manifest>

这里将会clone两个仓库:

1
2
git@gitee.com:sumumm/git-example.git
git@gitee.com:sumumm/openssl.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

然后我们就会得到这些文件:

image-20241023075652925

接下来我们clone出所有的仓库:

1
repo sync

然后就会clone出我们指定的两个仓库:

image-20241025203454736

1.3 对比提交记录

我们来看一下两个仓库的提交记录,会发现默认都是拉取的最新版本:

  • openssl.git
image-20241025203635562
  • git-example.git
image-20241025203711635

1.4 看一下远程仓库?

我们下载下来的仓库应该是对应了远程仓库的,我们执行以下命令看一下:

1
git remote -v
image-20241025204134069

可以看到,每一个本地仓库为远程仓库取的名字都叫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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="sumu-gitee"
fetch="git@gitee.com:sumumm"
autodotgit="true" />

<remote name="sumu-gitee"
fetch="gitee.com:oschina"
autodotgit="true" />

<default revision="master"
remote="sumu-gitee" />

<project path="git-example-local" name="git-example" />
<project path="openssl-local" name="openssl" />
<project path="repo-local" name="repo" />

</manifest>

这个情况属于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

不出意外的话肯定报错:

image-20241025214648113

2.2 remote name不同的情况

清单库文件看这里:repo-manifest: repo的清单库 - Gitee.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="sumu-gitee"
fetch="git@gitee.com:sumumm"
autodotgit="true" />
<remote name="soschina-gitee"
fetch="gitee.com:oschina"
autodotgit="true" />

<default revision="master"
remote="sumu-gitee" />

<project path="git-example-local" name="git-example" remote="sumu-gitee"/>
<project path="openssl-local" name="openssl" remote="sumu-gitee"/>
<project path="repo-local" name="repo" remote="soschina-gitee"/>

</manifest>

注意这个时候就需要为不同的仓库地址指定remote名字和revision分支了,因为这里默认写的master分支,但是repo那个仓库默认是main分支。我们修改如下(repo-manifest: repo的清单库 - Gitee.com):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="sumu-gitee"
fetch="git@gitee.com:sumumm"
autodotgit="true" />
<remote name="soschina-gitee"
fetch="gitee.com:oschina"
autodotgit="true" />

<default revision="master"
remote="sumu-gitee" />

<project path="git-example-local" name="git-example" remote="sumu-gitee"/>
<project path="openssl-local" name="openssl" remote="sumu-gitee"/>
<project path="repo-local" name="repo" remote="soschina-gitee" revision="fork_flow"/>

</manifest>

然后我们可以正常下载,但是吧就是用repo这命令的话对于其他人的仓库貌似不能用ssh地址,会报错:

image-20241025220741076

所以这里还要修改为https链接,清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="sumu-gitee"
fetch="git@gitee.com:sumumm"
autodotgit="true" />
<remote name="soschina-gitee"
fetch="https://gitee.com/oschina"
autodotgit="true" />

<default revision="master"
remote="sumu-gitee" />

<project path="git-example-local" name="git-example" remote="sumu-gitee"/>
<project path="openssl-local" name="openssl" remote="sumu-gitee"/>
<project path="repo-local" name="repo" remote="soschina-gitee" revision="fork_flow"/>

</manifest>

我们执行以下命令:

1
2
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

这个时候就可以了。我们用以下命令看一下三个仓库的远程仓库名:

1
git remote -v
image-20241025221004524

会发现和每个仓库指定的remote名字一样。

3. alias的使用

上一个实验做完,我们可以添加别人的仓库了,但是吧,就是每个仓库远程分支别名都是使用的不一样的名字,我们能不能搞成一样的?就跟平时使用git的时候一样,全部用origin?当然也可以啦,这个时候就需要使用remote标签的alias属性了。

3.1 清单库文件

清单库文件看这里repo-manifest: repo的清单库 - Gitee.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="origin"
fetch="git@gitee.com:sumumm"
autodotgit="true" />
<remote name="soschina-gitee"
fetch="https://gitee.com/oschina"
alias="origin"
autodotgit="true" />
<default revision="master"
remote="origin" />

<project path="git-example-local" name="git-example"/>
<project path="openssl-local" name="openssl"/>
<project path="repo-local" name="repo" remote="soschina-gitee" revision="fork_flow"/>
</manifest>

需要注意的是,必须要有一个remote标签的name为origin,否则会报这个:

image-20241025222139421

另外需要注意,这里还是需要为https://gitee.com/oschina/repo.git指定remote name。

3.2 初始化repo管理目录

我们执行以下命令:

1
2
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
repo sync

3.3 看一下远程仓库?

我们执行:

1
git remote -v
image-20241025222940599

这样每个远程仓库链接的别名就都一样了。

4. 拉取指定版本

4.1 清单库文件

清单库文件看这里:repo-manifest: repo的清单库 - Gitee.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="origin"
fetch="git@gitee.com:sumumm"
autodotgit="true" />
<remote name="soschina-gitee"
fetch="https://gitee.com/oschina"
alias="origin"
autodotgit="true" />
<default revision="master"
remote="origin" />

<project path="git-example-local" name="git-example"/>
<project path="openssl-local" name="openssl" revision="1a7ff22884d28ab7efba583a9d6cc7627b5f42a6"/>
<project path="repo-local" name="repo" remote="soschina-gitee" revision="fork_flow"/>
</manifest>

我这里指定openssl仓库的版本为1a7ff22。

image-20241025223320318

需要注意的是这里不能写简写1a7ff22, 要写完整的commid id:1a7ff22884d28ab7efba583a9d6cc7627b5f42a6,否则就可能会出现报错:

image-20241023220323126

4.2 初始化repo管理目录

执行以下命令:

1
2
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

4.3 看一下提交记录

当成功拉取分支和版本后,我们看一下这个本地的openssl仓库的提交记录:

image-20241025223640300

可以发现最新版本已经在1a7ff22这里了。

5. 拉取不同服务器仓库

这个跟添加一个服务器一样的,清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="origin"
fetch="git@gitee.com:sumumm"
autodotgit="true" />
<remote name="soschina-gitee"
fetch="https://gitee.com/oschina"
alias="origin"
autodotgit="true" />
<remote name="sumu-github"
alias="origin"
fetch="https://github.com/sumumm"
autodotgit="true" />

<default revision="master"
remote="origin" />

<project path="git-example-local" name="git-example"/>
<project path="openssl-local" name="openssl" revision="1a7ff22884d28ab7efba583a9d6cc7627b5f42a6"/>
<project path="repo-local" name="repo" remote="soschina-gitee" revision="fork_flow"/>
<project path="hexo-next-tags-plus-local" name="hexo-next-tags-plus" remote="sumu-github" revision="master"/>
</manifest>

6. 拉取指定分支

6.1 创建一个分支

我们在之前的gitee仓库中多创建一个测试分支:

image-20241025065829128

6.2 清单库

清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="gitee"
fetch="git@gitee.com:sumumm"
autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/sumumm/manifest/blob/master/default.xml -->

<default revision="master"
remote="gitee" /> <!--revision 为默认的拉取分支,后续提 pr 也以 revision 为默认目标分支-->
<!-- git@gitee.com:sumumm/git-example -->
<project path="git-example-1" name="git-example" revision="repo-demo" /> <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
<!-- git@gitee.com:sumumm/openssl.git -->
<project path="openssl.git-1" name="openssl" revision="1a7ff22884d28ab7efba583a9d6cc7627b5f42a6"/> <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->

<remote name="github"
fetch="git@github.com:sumumm"
autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/sumumm/manifest/blob/master/default.xml -->

<!-- git@github.com:sumumm/git-test.git-->
<project path="git-test-1" name="git-test" remote="github" revision="master"/> <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->

</manifest>

6.3 初始化repo管理目录

1
2
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

6.4 看一下提交记录

就会看到这里其实获取的已经是repo-demo分支的了:

image-20241025231127796

我们执行下面的命令:

1
git branch -a
image-20241025231146557

就可以看到整个仓库所有分支和当前的分支。

7. 指定clone的深度

对于有一个仓库,比如我后面会学习的uboot:nxp-imx/uboot-imx at rel_imx_4.1.15_2.1.0_ga (github.com)

image-20241025231404349

这样我们完全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)

image-20241025233049538

7.1 清单库

清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="origin"
fetch="git@gitee.com:sumumm"
autodotgit="true" />
<remote name="soschina-gitee"
fetch="https://gitee.com/oschina"
alias="origin"
autodotgit="true" />

<remote name="sumu-github"
alias="origin"
fetch="https://github.com/sumumm"
autodotgit="true" />

<remote name="nxp-imx"
alias="origin"
fetch="https://github.com/nxp-imx"
autodotgit="true" />
<default revision="master"
remote="origin" />

<project path="git-example-local" name="git-example" revision="repo-demo"/>
<project path="openssl-local" name="openssl" revision="1a7ff22884d28ab7efba583a9d6cc7627b5f42a6"/>
<project path="repo-local" name="repo" remote="soschina-gitee" revision="fork_flow"/>
<project path="hexo-next-tags-plus-local" name="hexo-next-tags-plus" remote="sumu-github" revision="master"/>
<project path="uboot" name="uboot-imx" remote="nxp-imx" revision="rel_imx_4.1.15_2.1.0_ga" clone-depth="1" />
</manifest>

这样直接写标签的话好像报错了(后来发现实际是因为tag的格式写的不对,可以看第8个例子):

image-20241025234826857

后面还是根据标签找到提交记录:

image-20241025234902777

然后直接拉取这个提交记录了。清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com

7.2 初始化repo管理目录

1
2
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

7.3 查看uboot的提交记录

image-20241025235444745

会发现只有一次提交,就是我们上面tag对应的a57b13b942d59719e3621179e98bd8a0ab235088。

8. 指定tag

8.1 创建一个tag

前面不是写tag的时候失败了,这里不知道是不是那个仓库的问题,我们还是以这个仓库为例git-example: 学习Git的时候的测试仓库 (gitee.com)

image-20241026074004990

这里我们在这个仓库创建一个tag:

1
2
3
git clone git@gitee.com:sumumm/git-example.git
cd git-example
git mylog
image-20241026074125575

我们在这里创建一个tag:

1
git tag V2023_06_23_10_06_53-release f5a3adf

然后推送到远程仓库:

1
git push origin --tags # 推送所有的tags

然后我们看一下gitee仓库:

image-20241026074501572

8.2 清单库

清单库可以看这里:repo-manifest: repo的清单库 - Gitee.com

8.3 初始化repo管理目录

1
2
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

这里执行repo sync的时候直接就报错了:

image-20241026075406236

可以试一下直接git clone:

1
git clone -b V2023_06_23_10_06_53-release git@gitee.com:sumumm/git-example.git
image-20241026075606234

发现我们的tag是存在的。那肯定还是哪里配置不对,后来搜索资料发现,使用tag的时候不能直接写tag名,要加上refs/tags/

8.4 更新清单库文件

后来发现,其实是因为tag的时候不能只写tag名,要这样写:

1
refs/tags/tag_name

所以这里更新一下清单库:repo-manifest: repo的清单库 - Gitee.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="origin"
fetch="git@gitee.com:sumumm"
autodotgit="true" />

<remote name="soschina-gitee"
fetch="https://gitee.com/oschina"
alias="origin"
autodotgit="true" />

<remote name="sumu-github"
alias="origin"
fetch="https://github.com/sumumm"
autodotgit="true" />

<remote name="nxp-imx"
alias="origin"
fetch="https://github.com/nxp-imx"
autodotgit="true" />
<default revision="master"
remote="origin" />

<project path="git-example-local" name="git-example" revision="refs/tags/V2023_06_23_10_06_53-release"/>
<project path="openssl-local" name="openssl" revision="1a7ff22884d28ab7efba583a9d6cc7627b5f42a6"/>
<project path="repo-local" name="repo" remote="soschina-gitee" revision="fork_flow"/>
<project path="hexo-next-tags-plus-local" name="hexo-next-tags-plus" remote="sumu-github" revision="master"/>
<project path="uboot" name="uboot-imx" remote="nxp-imx" revision="a57b13b942d59719e3621179e98bd8a0ab235088" clone-depth="1" />
</manifest>

然后重新执行对应的创建以及同步命令之后,就会发现正常拉取了分支了。

8.5 看一下提交记录

我们看一下git-example-local的提交记录:

image-20241026223334255

会发现就处于f5a3adf这次提交啦。