• 多仓库管理工具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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    拉取远程仓库

    $ repo init -u ssh://git@github.com:zhangsan/manifest.git -b master
    $ repo sync
    
    • 1
    • 2

    命名本地仓库的workspace的分支

    $ repo start master --all
    
    • 1

    部署

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

    repo初始化本地仓库

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

    repo init -u ssh://git@gitlab.com:zhangsan/manifest.git
    repo sync
    
    • 1
    • 2

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

    • 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://git@gitlab.com: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://git@gitlab.com:zhangsan/manifest.git -b master
    #在已经发布的小版本上进行测试(为客户添加patch):
    repo init -u ssh://git@gitlab.com:zhangsan/manifest.git -b sdk_v1.2.3
    #在release分支上提交只有该release需要的patch(master不需要):
    repo init -u ssh://git@gitlab.com:zhangsan/manifest.git -b sdk_v1.2_release
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    大数据开源框架技术汇总
    Sa-Token 一个轻量级Java权限认证框架
    C#_Win32_PInvoke源码生成器
    java游戏服务器性能压测神器:jprofiler
    360汽车虚拟展厅提供高便利的沉浸看车购车服务
    【应用】Docker
    游游现在有a个 y ,b个 o ,c个 u ,他想用这些字母拼成一个字符串。
    在UnityUI中绘制线状统计图
    Python 图片处理
    robots (攻防世界)
  • 原文地址:https://blog.csdn.net/u010020404/article/details/127412935