多仓库管理工具git-repo部署

前言

在项目开发过程中,通常需要为不同的功能创建不同的repo(尽管有些大公司使用MonoRepo策略,例如Google,Uber,Microsoft…,我们可以简单的理解为team规模太大,沟通成本太高,通过单一的repo将间接地迫使不同team及时保持沟通。)

Google的Gerrit采用repo(The Multiple Git Repository Tool)来管理项目的多个仓库,它是在Git基础上构建的一个脚本工具,对于大型项目而言,这是种很好的管理方式。虽然我们采用的是Gitlab代码托管平台,但是我们也可以借鉴这种管理方式,来管理我们项目的多个仓库。

组成要素

采用manifest来管理多个远程仓库,需要三个基本要素:

  • 远程manifest仓库
  • 远程git-repo仓库
  • 本地repo脚本

其中“本地repo脚本”来源于远程git-repo仓库。

远程manifest仓库

manifest仓库主要包含一个或多个xml文件用来描述远程的多个仓库。repo工具根据这些描述信息来管理多个仓库。其格式规范参考
repo Manifest Format

我们需要在Gitlab上创建manifest仓库,这一仓库只有Maintainer有权限进行提交。

远程git-repo仓库

参考git-repo

这是官方完整的repo工具仓库,在本地初始化项目工程时,我们首先需要将这个仓库拉下来。之后我们就可以使用repo所提供的的丰富的功能了。

本地repo脚本

简单的repo工具,来自git-repo仓库,可以完成repo的初始化。

repo的使用

安装repo脚本工具

从repo使用指导(将客制化好的repo脚本上传服务器供大家下载)下载repo脚本
以ubuntu为例,进行安装

$ mkdir -p ~/bin
# 将repo拷贝到~/bin目录下
$ chmod a+rx ~/bin/repo
# 将~/bin添加到系统的PATH环境变量中(譬如添加到.bashrc或者.zshrc中,取决于你用的shell版本),譬如添加到.zshrc中

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
$ source ~/.zshrc

拉取远程仓库

$ repo init -u ssh://[email protected]:zhangsan/manifest.git -b master
$ repo sync

命名本地仓库的workspace的分支

$ repo start master --all

部署

这里我们首先说明repo初始化本地仓库的基本流程,然后再叙述如何将repo添加到自己的工程管理工作中。

repo初始化本地仓库

当我们要拉取整个工程的所有仓库时,通过以下两条条指令就可完成:

repo init -u ssh://[email protected]:zhangsan/manifest.git
repo sync

第一条指令主要完成两个动作:

  • clone git-repo仓库到本地,并检出git-repo的默认分支
  • clone manifest仓库到本地,并检出manifest的默认分支

第二条指令根据manifest仓库中的xml文件的描述,拉取xml文件描述的所有远程仓库到本地,并在各个仓库中检出xml描述的revision分支。

clone git-repo仓库到本地,并检出git-repo的默认分支

该动作是根据本地repo脚本进行的,REPO_URL指定了git-repo的位置,REPO_REV指定了要检出的默认分支是哪一个分支。

默认情况下REPO_URL指向https://gerrit.googlesource.com/git-rep , REPO_REV指向main分支(git-repo的默认分支)。

由于墙的问题,大部分情况下从官方链接clone git-repo仓库都会失败。因此为了其他开发者的开发方便,我们需要将git-repo放到自己的Gitlab托管平台。并对仓库中的repo脚本做一些修改,让它指向我们Gitlab托管平台的git-repo仓库。我们将在后面git-repo客制化重点讲述这部分该如何做。

clone manifest仓库到本地,并检出manifest的默认分支

该动作根据命令行中的url来clone manifest仓库到本地,并检出默认分支(也可以在命令行中通过“-b ”的方式检出指定的分支)

git-repo客制化

客制化的工作主要是将repo脚本的默认REPO_URL指向我们自己克隆的git-repo仓库。

第一步:

  • 在gitlab上创建空的git-repo仓库(如果能直接从 https://gerrit.googlesource.com/git-repo 导入最好,但是一般由于墙的存在,权限的问题无法导入成功)
  • 将官方git-repo仓库克隆到本地
  • 将本地仓库的所有分支和tag push到gitlab的git-repo仓库

第二步:

  • 从stable分支上检出一个新的分支customer,用来提交我们的客制化修改
  • 修改repo脚本的REPO_URL指向Gitlab的git-repo仓库(ssh://[email protected]:zhangsan/git-repo.git)
  • 修改repo脚本的REPO_REV指向customer分支

第三步:

  • 替换PGP pubkey
  • 打GPG-signed tag
  • 提交分支和tag到远程仓库

manifest多版本管理

manifest多版本管理策略

manifest应该提供检出各仓库不同版本的功能。
各仓库需要检出的版本:

  • master分支:Developer需要
  • release分支:Maintainer需要
  • release小版本tag:Maintainer需要

为此manifest仓库需要对上述版本(分支和tag)创建对应的分支:

  • master分支
  • release分支
  • release 小版本分支

不同的manifest分支通过改变revision来检出不同的个仓库分支。

manifest多版本管理使用指导一节中
不同的初始化方式sync到本地的仓库都是相同的,只是各仓库(不包含git-repo和manifest仓库)默认检出的分支不同

manifest多版本管理使用指导

不同版本初始化使用示例

#在master分支上进行开发:
repo init -u ssh://[email protected]:zhangsan/manifest.git -b master
#在已经发布的小版本上进行测试(为客户添加patch):
repo init -u ssh://[email protected]:zhangsan/manifest.git -b sdk_v1.2.3
#在release分支上提交只有该release需要的patch(master不需要):
repo init -u ssh://[email protected]:zhangsan/manifest.git -b sdk_v1.2_release

你可能感兴趣的:(SDK项目开发&管理,git,github,devops)