文章目录
前言
我们知道,Git是用来管理某一个仓库,那当一个项目用到了多个仓库时,怎么来同步管理这些仓库呢?这个时候就可以引入Repo管理。
Repo介绍
Repo工具最初由Google开发,目的是为了简化和协调众多子项目的版本控制和协作过程。它被广泛用于Android操作系统的开发过程中,用于管理数以百计的Git仓库。通过Repo,开发者可以在单个工作目录中管理多个Git仓库,这些仓库可以相互依赖,但保持独立的版本控制。
清单仓库
我们从"清单仓库(Manifests Repo)"
来切入Repo的学习。清单仓库本质上是一个 Git 仓库,但它的作用并不是存储项目代码,而是用来描述项目的整体结构及其子仓库的组织方式。通俗的说,清单仓库用来告诉Repo工具:你的项目需要哪些代码仓库、每个代码仓库在哪里可以找到、每个代码仓库该放在哪个文件夹里、每个代码仓库用哪个版本。
用一张图来更清晰的了解"清单仓库"的定位:
可以看到,清单仓库和其它代码仓库是同一个等级的,只不过清单仓库里储存的是如何管理A~G仓库的文件。所以在一个使用repo管理的项目中,一定有一个清单仓库。
清单仓库的组成
一个典型的清单仓库包含以下内容:
manifest.xml
:核心文件,定义项目所有子仓库的布局和版本信息。manifests/ 文件夹
:存放多个 XML 文件,每个文件对应不同版本或配置的项目结构。.repo/ 文件夹
:Repo 在初始化时生成,用于存储管理信息。
以下是一个manifest.xml
文件的示例:
shell
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="origin" fetch="https://example.com/git/" />
<default remote="origin" revision="main" />
<project name="kernel" path="src/kernel" dest-branch="develop" revision="v5.10" />
<project name="uboot" path="src/uboot" revision="2023.01" />
<project name="tools" path="src/tools" />
</manifest>
解释:
remote
节点:定义远程仓库地址。name="origin"
表示远程仓库名称。fetch="https://example.com/git/"
指定仓库的基础 URL,所有子仓库的代码都从这里拉取。
default
节点:定义默认属性。remote="origin"
指定默认的远程仓库。revision="main"
表示默认使用的分支。
project
节点:定义每个子仓库的信息。name
表示子仓库名称。path
表示子仓库克隆后在本地的存放路径。revision
表示子仓库对应的分支或标签或提交哈希。
举例:
shell
<project name="kernel" path="kernel/5.10" dest-branch="develop" revision="v5.10" />
所以实际拉取的地址和分支是:
- 仓库克隆地址:https://example.com/git/kernel
- 目标分支:develop-4.9(根据 dest-branch 配置)
- 代码版本:v5.10(根据 revision 配置)
同时,将拉下来的仓库存放到了当前目录下的kernel/5.10文件夹下。
初始化Repo
shell
repo init -u https://example.com/git/manifests.git -b linux -m manifest.xml
解释:
-u https://example.com/git/manifests.git
:指定清单仓库的 URL,manifests.git
就是清单仓库。-b linux
:指定你想要初始化的分支,linux
是你清单仓库中的分支,Repo 会基于这个分支拉取配置。-m manifest.xml
:指定具体的清单文件,这里是manifest.xml
,它定义了各个子项目(如kernel
,uboot
,tools
等)及其相应的版本和路径。
同步远程仓库
shell
repo sync
该命令会根据 manifest.xml
中的定义,从远程仓库拉取代码。
Repo实际应用
对于Repo的建立应由项目管理员建立,目前本人还没有更多的实际应用经验分享。以下是GPT从实际的工程角度来描述repo仓库建立的一些关键点:
- 项目启动阶段:
项目管理员会在项目开始时规划版本控制结构,如果项目包含多个 Git 仓库,会选择使用 repo 来协调这些仓库的管理。 - 创建 manifest 仓库:
项目管理员创建一个 manifest 仓库,并在其中维护 manifest.xml 文件,记录所有子仓库的地址、分支和提交哈希等信息。 - 初始化 repo 配置:
管理员提供清单仓库的 URL 和分支信息,开发人员通过 repo init 初始化仓库,之后执行 repo sync 同步项目代码。 - 后期维护:
项目管理员负责更新 manifest.xml 文件,开发人员使用 repo sync 拉取最新的代码,确保本地代码与远程仓库同步。