从零开始搭建repo 与使用

一、repo 简介

在一个大型项目中,一般会拆成多个子系统来分开管理,每一个子系统都对应着一个git仓库。但在拉取整个项目的时候就需要一个一个去拉取仓库,或者要写一个shell脚本去拉取,这样做可以,但略显笨拙。于是repo来拯救了我们,r它是一个建立在git上的工具,本质其实是一个Python脚本,所以需要安装Python,像Android这样的系统也是用repo来管理的。

二、repo服务端的搭建

首先,在服务端只需要建立一个仓库名为manifest,我这里使用的是gitee(使用自己搭建的git服务器也是一样的)

repo仓库恢复成默认 repo仓库搭建教程_服务端

然后可以git clone到本地来操作。

repo仓库恢复成默认 repo仓库搭建教程_服务器_02

manifest中,创建一个.xml文件,该文件就决定了需要下载哪些仓库,如我创建了一个game.xml文件

repo仓库恢复成默认 repo仓库搭建教程_服务端_03

然后在其中输入:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="gitee"
           fetch="https://gitee.com/chensmart" />
  <default revision="master"
           remote="gitee" sync-j="2" />
  <project path="data" name="game" revision="master" />
</manifest>
  • remote: 远程服务端,namerepo仓库名称,fetch 为 仓库url
  • default:设置每个项目默认的仓库和分支,remote指定了使用哪一个远程服务端
  • project: 每个项目的git仓库,path会指向下载后的仓库放在那个路径
  • name: 服务端git仓库名称,指向的是在fetch在已有的仓库名。
  • revision: 分支名称或者commit id

完成之后就提交上去。

repo仓库恢复成默认 repo仓库搭建教程_git_04

到此,服务端的任务就完成了,其实在服务端就是建了一个仓库而已,然后在其中创建了一个xml文件,并在其中指定了需要的仓库。

三、repo客户端的搭建

首先在客户端我们就需要安装repo的应用:

sudo snap install git-repo

使用自带源下载的repo会出问题,所以我们使用以下的方法

mkdir ~/bin
PATH=~/bin:$PATH
git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
cd git-repo/
cp repo ~/bin/
chmod a+x ~/bin/repo

这样在后续的使用中就不会出问题(血泪的教训啊)

然后,创建一个文件夹下载我们仓库,在其中使用repo初始化命令:

repo init -u https://gitee.com/chensmart/manifest -b master -m game.xml
  • -u(–manifest-url):设定清单库的Git服务器地址
  • -m(–manifest-name):当有多个清单文件时,指定清单库中的某个清单为有效的清单文件。默认为default.xml
  • -b(–manifest-branch):选择一个maniest仓库中的一个特殊的分支

然后输入用户名和密码

repo仓库恢复成默认 repo仓库搭建教程_repo仓库恢复成默认_05

现在文件夹下就有了.repo文件夹,repo init主要完成了如下操作:

  1. 完成repo工具的完整下载,现有的不过是repo的引导程序。初始化操作会从repo脚本里设定的镜像地址中克隆repo.git库到当前的目录下的.repo文件夹中。
  2. 克隆创建的清单库manifest.git,也就是我们在服务端创建的仓库,里面game.xml文件是repo工作的指引文件。

最后同步就是同步项目了,把manifest.git中的清单文件game.xml中所指引的仓库下载下来。

repo sync

repo仓库恢复成默认 repo仓库搭建教程_repo仓库恢复成默认_06

经过同步,指定仓库中的内容就可以下载下来了。

如果某个仓库同步过,repo sync就相当于git clone操作,把对应的远程仓库拷贝到本地来。

如果工程已经同步过,repo sync就相当于git remote update git rebase origin/branch

四、总结

其实repo的搭建并不复杂,服务端只需要建立一个仓库即可,而客户端就安装repo工具,对服务器和原项目不需要有多大的改动。

原理也很简单,其实就像一个shell脚本,通过.xml文件里的指引,把remotefetchprojectname组合起来就是一个仓库的链接,然后通过该链接去下载对应的仓库而已。当然,repo还有其他的功能如使用linkfile可以在同步完成后创建链接,还有其他功能,这些就有待读者去发掘了。

jectname组合起来就是一个仓库的链接,然后通过该链接去下载对应的仓库而已。当然,repo还有其他的功能如使用linkfile`可以在同步完成后创建链接,还有其他功能,这些就有待读者去发掘了。