1. 背景概要
最近在编译项目时,出现了一个小问题:
修复一个bug时,需要拉取一个bugfix分支,然后修改相应的代码push到远端,然后使用Jenkins构建bugfix分支出bugfix 版本给客户验证,现有的方式是某个发行版有一个对应的Jenkins 构建Job,现在出hotfix版本就要修改Jenkins的Job进行构建,但是不是每个人都会修改Jenkins配置,某次的修改导致构建和实际不一致,出的版本也不是正常的版本。
而且谁修改了Jenkins配置也没有相应的记录,无法追溯。
为了解决这个问题,采用Repo方式来管理多个仓库代码和项目分支。
2. Repo介绍
repo
是 Google 提供的一个用于管理多个 Git 仓库的工具。它是建立在 Git 之上的一个抽象层,用于简化管理由多个 Git 仓库组成的项目的复杂性。repo
主要用于 Android 开源项目的管理,它允许你在一个项目中同时使用多个 Git 仓库,并提供了一种统一的方式来处理这些仓库。
repo
工具使用一个称为 manifest
的 XML 文件来定义项目的目录结构和每个仓库的配置信息。manifest
文件描述了项目中所需的所有 Git 仓库,包括它们的远程 URL、分支、路径等信息。使用 repo
工具,你可以轻松地初始化、同步、分支、合并和管理多个 Git 仓库,使得协作开发变得更加方便。
2.1 Manifest文件结构
repo
的 manifest
文件是一个 XML 文件,用于定义项目的结构,包括各个 Git 仓库的配置信息。以下是一个简化的示例 manifest
文件的结构:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<!-- remote 元素定义 Git 服务器的信息 -->
<remote name="origin" fetch="https://git.devwiki.net/" />
<!-- default 元素定义默认的仓库配置 -->
<default revision="main" remote="origin" />
<!-- project 元素定义每个 Git 仓库 -->
<project path="RepoProject1" name="RepoDemo/RepoProject1" />
<project path="RepoProject2" name="RepoDemo/RepoProject2" />
<!-- 可以添加更多的 project 元素 -->
</manifest>
2.2 Manifest文件解释
上述示例中的主要元素包括:
-
<manifest>
(清单):- 这是根元素,包含整个清单的定义。
-
<remote>
(远程):name
(名称):指定远程的名称,是一个短标识符。fetch
(拉取):定义从远程仓库获取对象时使用的默认 URL。
-
<default>
(默认):revision
(修订):指定在<project>
中未指定时要使用的默认修订(分支或标签)。remote
(远程):如果在<project>
中未指定,则引用要使用的默认远程仓库。sync-j
:表示最大的并行获取作业数。
-
<project>
(项目):path
(路径):指定项目在工作目录中的相对路径。name
(名称):定义 Git 仓库的 URL。revision
(修订):指定要检出的修订(分支、标签或提交 ID)。remote
(远程):引用在<remote>
中定义的与此项目相关联的远程仓库的名称。sync-c
:指定要克隆的历史深度。
这些属性共同描述了由 repo
管理的 Git 仓库的结构和配置。每个 <project>
元素代表一个要包含在工作区中的仓库,而 <remote>
和 <default>
元素为仓库提供了全局配置设置。<manifest>
作为所有这些配置信息的总体容器。
manifest
文件中的路径是相对于工作目录的,它指定了仓库在本地文件系统中的存放位置。name
属性指定了 Git 仓库的 URL。
这里的 RepoPeoject1 仓库的地址为:https://git.devwiki.net/RepoDemo/RepoProject1
这里的 RepoPeoject2 仓库的地址为:https://git.devwiki.net/RepoDemo/RepoProject2
在实际使用中,可以根据项目的需要进行更复杂的配置,包括设置多个远程、指定仓库的分支、设置仓库同步的深度等。详细的配置选项可以参考 repo
工具的文档。
3. Repo使用
3.1 clone repo代码
可以从 Google官方克隆repo的代码:git clone https://gerrit.googlesource.com/git-repo
,
如果不能访问Google,可以使用我fork到GitHub的地址:Dev-Wiki/git-repo (github.com),
如果GitHub也无法访问,可使用fork到gitee的地址:DevWiki/git-repo (gitee.com)
注意:在Windows平台,需要把代码克隆到你的项目代码所在的盘符。
注意:在Windows平台,需要把代码克隆到你的项目代码所在的盘符。
注意:在Windows平台,需要把代码克隆到你的项目代码所在的盘符。
比如,我的代码存放位置是 D:\Code
,那么 repo 的代码位置存放在 D盘
。
3.2 环境配置
1. 配置终端
下载安装Windows终端,可以在 Windows应用商店中安装,也可以关注公众号DevWiki后回复:Windows终端 获取安装包,安装以后,设置中添加 git bash,命令为:
C:\Program Files\Git\bin\bash.exe --login -i
保存以后可以在 Windows终端中查看点击启动:
2. 配置repo
clone代码以后,把文件夹名称由 git-repo
改为 repo
并checkout v2.39 tag分支,
$ git checkout -b v2.39 tags/v2.39
Switched to a new branch 'v2.39'
然后把 repo 代码的路径配置到Windows环境变量中:
文件管理器 - 对“此电脑” 右键 - 高级系统设置 - 环境变量 - 系统变量 - Path
然后在 git bash中查看配置结果,(如果已经打开了git bash 需要关闭重新打开)
$ repo --version
<repo not installed>
repo launcher version 2.39
(from D:\Code\repo\repo)
git 2.41.0.windows.1
Python 3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)]
OS Windows 10 (10.0.22631)
CPU AMD64 (Intel64 Family 6 Model 183 Stepping 1, GenuineIntel)
Bug reports: https://issues.gerritcodereview.com/issues/new?component=1370071
3. 安装配置 python
从 python官方下载 3.8以上版本或者关注公众号 DevWiki 后回复:python,获取安装包,安装后并配置到系统变量中,使用 git bash 查看版本:
$ python --version
Python 3.10.6
3.2 repo使用
1. 创建 repo 的git仓库
创建一个 git 仓库,存放 repo配置,这样方便查看修改记录,比如:RepoDemo/WinRepo - WinRepo - DevWiki Gitea,仓库包含一个默认的配置文件:default.xml
,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<!-- remote 元素定义 Git 服务器的信息 -->
<remote name="origin" fetch="https://git.devwiki.net/" />
<!-- default 元素定义默认的仓库配置 -->
<default revision="main" remote="origin" />
<!-- project 元素定义每个 Git 仓库 -->
<project path="RepoProject1" name="RepoDemo/RepoProject1" />
<project path="RepoProject2" name="RepoDemo/RepoProject2" />
<!-- 可以添加更多的 project 元素 -->
</manifest>
请根据实际项目来进行配饰, 上面配置是 管理使用 RepoProject1
和 RepoProject2
两个仓库,没有配置revision, 表示使用默认 master 分支。
2. 模拟构建main分支
假设在RepoDemo 目录构建项目,则执行:
repo init -u https://git.devwiki.net/RepoDemo/WinRepo -b master --worktree
配置正确的情况下可以看到输出如下:
$ repo init -u https://git.devwiki.net/RepoDemo/WinRepo -b master --worktree
Downloading Repo source from D:\Code\repo\.git
remote: Enumerating objects: 8578, done.
remote: Counting objects: 100% (8578/8578), done.
remote: Compressing objects: 100% (2318/2318), done.
remote: Total 8578 (delta 6181), reused 8566 (delta 6175), pack-reused 0
repo: Updating release signing keys to keyset ver 2.3
warning: --worktree is experimental!
Your identity is: DevWiki <devwiki@qq.com>
If you want to change this, please re-run 'repo init' with --config-name
Testing colorized output (for 'repo diff', 'repo status'):
black red green yellow blue magenta cyan white
bold dim ul reverse
Enable color display in this user account (y/N)?
repo has been initialized in D:\Code\gitea\RepoDemo
然后可以执行 repo sync
开始同步 repo仓库 master仓库配置的 RepoProject1
和 RepoProject2
的 main
分支:
$ repo sync
remote: Enumerating objects: 5, done.
remote: Counting objects: 20% (1/5)
remote: Counting objects: 40% (2/5)
remote: Counting objects: 60% (3/5)
remote: Counting objects: 80% (4/5)
remote: Counting objects: 100% (5/5)
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 50% (1/2)
remote: Compressing objects: 100% (2/2)
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Fetching: 100% (2/2), done in 2.356s
Checking out: 100% (2/2), done in 0.558s
repo sync has finished successfully.
成功以后可以查看相应的分支:
$ cd RepoProject1
$ git lg
* 2147fc4 (HEAD, origin/main, m/master)add readme(14 minutes ago)<DevWiki>
$ cd ../RepoProject2
$ git lg
* a1da319 (HEAD, origin/main, m/master)add readme(14 minutes ago)<DevWiki>
3. 配置非默认分支
有时候 Peoject1 和 Project2 可能分支名称不一样,那可以单独配置需要分支,如下:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<!-- remote 元素定义 Git 服务器的信息 -->
<remote name="origin" fetch="https://git.devwiki.net/" />
<!-- default 元素定义默认的仓库配置 -->
<default revision="main" remote="origin" />
<!-- project 元素定义每个 Git 仓库 -->
<project path="RepoProject1" name="RepoDemo/RepoProject1" revision="v1.0"/>
<project path="RepoProject2" name="RepoDemo/RepoProject1" revision="v1.0"/>
<!-- 可以添加更多的 project 元素 -->
</manifest>
4. 总结
使用 repo 可以方便的进行多仓库管理,统一代码管理,使其保持一致的状态。同时通过配置文件可以清晰的看出项目结构,而且 repo 具有并行处理能力,多个仓库的代码可以并行处理。
文中涉及的软件可关注公众号DevWiki后回复方括号里面的文字可获取:
- 回复【python】:获取python安装包
- 回复【Windows终端】:获取安装包
- 回复【repo】:获取源码压缩包
如果你觉得本文对你有帮助,请点赞支持。关注我的公众号获取更多技术,工具和美图~