6

Windows系统Repo使用教程

 8 months ago
source link: https://blog.devwiki.net/2023/11/27/Windows-repo.html#cl-15
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Google_2015_logo.svg.png

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 <[email protected]>
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>

使用 repo 可以方便的进行多仓库管理,统一代码管理,使其保持一致的状态。同时通过配置文件可以清晰的看出项目结构,而且 repo 具有并行处理能力,多个仓库的代码可以并行处理。

文中涉及的软件可关注公众号DevWiki后回复方括号里面的文字可获取:

  • 回复【python】:获取python安装包
  • 回复【Windows终端】:获取安装包
  • 回复【repo】:获取源码压缩包

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

qrcode_for_gh_bed8d38fa7cb_258.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK