repo介绍与使用

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

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

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

在manifest中,创建一个.xml文件,该文件就决定了需要下载哪些仓库,如我创建了一个game.xml文件
然后在其中输入:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="gitee"
           fetch="https://gitee.com/chensmart" 
            review="10.XX.XX.XX:8090"/>
  <remote  name="origin"
           fetch="https://github.com/chensmart" 
            review="10.XX.XX.XX:8090"/>

  <default revision="master"
           remote="gitee" sync-j="2" />

  <project groups='all' name="XXX/XXX" path="XXX/XXX" remote="origin" revision="develop">
    <linkfile dest="XX/XX/" src="../.."/>
    <copyfile dest="XX/XX/XX.txt" src="./xx.txt"/>
  </project>

  <project path="data" name="game" revision="master" />

  <repo-hooks enabled-list="post-sync" in-project="XXX/repohooks"/>
</manifest>
remote 描述了远程仓库的基本信息
     name:远程仓库的名称,通常我们看到的命名是origin
     fetch:git库地址url
     review:用作code review的server地址

default:default标签定义的属性,将作为每个项目默认的属性,在标签中,也可以重写这些属性
     revision:默认分支名称或者commit id
     remote:默认的远程版本库名称
     sync -j:表示在同步远程代码时,并发的任务数量

project: repo管理的每个项目的git仓库
      path:把代码下载到指定目录下
      name:该项目远程版本库的相对路径
      groups:该项目远程版本库所属组
      revision:单独指定分支名称或者commit id
      remote:单独指定远程版本库名称

project元素下的子元素copyfile,定义clone后从src到dest拷贝操作。
project元素下的子元素linkfile,定义clone后dest到src的软连接repo钩子: in-project下面应该有一个与钩子同名的python文件。因此,如果您想支持预上传钩子,您需要创建一个名为post-sync.py的文件。Repo将在处理钩子时动态加载该模块,然后调用其中的主函数。
in-project:定义挂钩的项目。该值必须与先前定义的元素的name属性(而不是属性)匹配。
enabled-list:要使用的钩子列表,空格或逗号分隔。
remove-project: 从内部的manifest表中删除指定的project。经常用于本地的manifest文件,用户可以替换一个project的定义。

完成之后就提交上去。
到此,服务端的任务就完成了,其实在服务端就是建了一个仓库而已,然后在其中创建了一个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 init主要完成了如下操作:

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

如果某个仓库未同步过,repo sync就相当于git clone操作,把对应的远程仓库拷贝到本地来。
如果工程已经同步过,repo sync就相当于git remote update git rebase origin/branch

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

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值