目 录CONTENT

文章目录

Windows系统Repo使用教程

DevWiki
2023-11-27 / 0 评论 / 1 点赞 / 513 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-03-30,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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文件结构

repomanifest 文件是一个 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文件解释

上述示例中的主要元素包括:

  1. <manifest>(清单):

    • 这是根元素,包含整个清单的定义。
  2. <remote>(远程):

    • name(名称):指定远程的名称,是一个短标识符。
    • fetch(拉取):定义从远程仓库获取对象时使用的默认 URL。
  3. <default>(默认):

    • revision(修订):指定在 <project> 中未指定时要使用的默认修订(分支或标签)。
    • remote(远程):如果在 <project> 中未指定,则引用要使用的默认远程仓库。
    • sync-j:表示最大的并行获取作业数。
  4. <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

image-20231126142257506

保存以后可以在 Windows终端中查看点击启动:

image-20231126142346907

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

image-20231126135610500

image-20231126140655999

然后在 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>

请根据实际项目来进行配饰, 上面配置是 管理使用 RepoProject1RepoProject2两个仓库,没有配置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仓库配置的 RepoProject1RepoProject2main分支:

$ 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】:获取源码压缩包

如果你觉得本文对你有帮助,请点赞支持。关注我的公众号获取更多技术,工具和美图~

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
博主关闭了所有页面的评论