在项目开发过程中,通常需要为不同的功能创建不同的repo(尽管有些大公司使用MonoRepo策略,例如Google,Uber,Microsoft…,我们可以简单的理解为team规模太大,沟通成本太高,通过单一的repo将间接地迫使不同team及时保持沟通。)
Google的Gerrit采用repo(The Multiple Git Repository Tool)来管理项目的多个仓库,它是在Git基础上构建的一个脚本工具,对于大型项目而言,这是种很好的管理方式。虽然我们采用的是Gitlab代码托管平台,但是我们也可以借鉴这种管理方式,来管理我们项目的多个仓库。
采用manifest来管理多个远程仓库,需要三个基本要素:
其中“本地repo脚本”来源于远程git-repo仓库。
manifest仓库主要包含一个或多个xml文件用来描述远程的多个仓库。repo工具根据这些描述信息来管理多个仓库。其格式规范参考
repo Manifest Format
我们需要在Gitlab上创建manifest仓库,这一仓库只有Maintainer有权限进行提交。
参考git-repo
这是官方完整的repo工具仓库,在本地初始化项目工程时,我们首先需要将这个仓库拉下来。之后我们就可以使用repo所提供的的丰富的功能了。
简单的repo工具,来自git-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://git@github.com:zhangsan/manifest.git -b master
$ repo sync
$ repo start master --all
这里我们首先说明repo初始化本地仓库的基本流程,然后再叙述如何将repo添加到自己的工程管理工作中。
当我们要拉取整个工程的所有仓库时,通过以下两条条指令就可完成:
repo init -u ssh://git@gitlab.com:zhangsan/manifest.git
repo sync
第一条指令主要完成两个动作:
第二条指令根据manifest仓库中的xml文件的描述,拉取xml文件描述的所有远程仓库到本地,并在各个仓库中检出xml描述的revision分支。
该动作是根据本地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客制化重点讲述这部分该如何做。
该动作根据命令行中的url来clone manifest仓库到本地,并检出默认分支(也可以在命令行中通过“-b
客制化的工作主要是将repo脚本的默认REPO_URL指向我们自己克隆的git-repo仓库。
第一步:
第二步:
第三步:
manifest应该提供检出各仓库不同版本的功能。
各仓库需要检出的版本:
为此manifest仓库需要对上述版本(分支和tag)创建对应的分支:
不同的manifest分支通过改变revision来检出不同的个仓库分支。
manifest多版本管理使用指导一节中
不同的初始化方式sync到本地的仓库都是相同的,只是各仓库(不包含git-repo和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