repo简介

repo是谷歌用python脚本写的调用git的一个脚本,并不是用于取代git,它简化了对多个git版本库的管理。用repo管理的版本库都需要使用git命令来进行操作。
大型项目模块化/组件化之后,各模块也作为独立的 git 仓库从主项目里剥离了出去,各模块各自管理自己的版本。每一个子项目都是一个git仓库,每个git仓库都有很多分支版本,为了方便统一管理各个子项目的git仓库,需要一个上层工具批量进行处理,因此诞生了repo。

安装repo

由于repo归根究底是用来简化对git的管理所以使用repo时必须保证已经安装了git。公版的repo可以使用命令下载:

sudo apt-get install repo

或者:

curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  

可以通过curl工具从http://commondatastorage.googleapis.com/git-repo-downloads/repo获得,并且保存在文件~/bin/repo中我们也可以保存在任何路径中。由于~/bin/repo是一个python脚本,我们通过chmod命令赋予它可执行的权限,以便接下来我们可以通过repo命令来运行它。

在工作中公司很可能会给你提供一个公司用的repo,公版的repo会访问一些谷歌的网站有些是国家禁止的除非你翻墙否则repo init的时候就会报Errno 110 无法连接。因为组成repo工具的那些Python脚本本身也是一个git仓库,每次运行repo的时候都会去repo这个脚本中有个REPO_URL的地址中去安装repo自己的这个git仓库,公版的repo设置的repo git仓库的地址是一个谷歌的地址,国家禁止访问。一般公司都会将REPO_URL设置成一个自己公司的repo git地址。
repo个人理解就是一个可执行脚本,放在/usr/bin/比较好可以直接使用,如果你的系统中有很多个版本的repo,你也可以通过绝对路径选择使用哪个repo。作者都是下载下来公司提供的一个repo放到一个不容易被修改的地方,然后在/usr/bin/创建一个软连接,链接到我想使用的那个repo。

repo涉及到的仓库

repo也建立一个Git仓库,用来记录当前项目下各个子项目的git仓库分别处于哪一个分支,这个仓库通常叫做:manifest仓库(清单库)。
组成repo工具的那些Python脚本本身也是一个git仓库,我们称之为repo 仓库。
我们整个这个大项目的很多子项目也是git仓库。
到目前为止,我们提到了三种类型的git仓库,分别是repo仓库、manifest仓库和子项目仓库。
repo仓库通过manifest仓库可以获得所有子项目仓库的元信息。有了这些元信息之后,我们就可以通过repo仓库里面的python脚本来操作子项目。

manifest仓库(项目清单库)采用一个default.xml的文件来管理各个子项目:
default.xml

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <default remote="origin" sync-j="4" revision="master" />
  <remote fetch="git@XXX.XXX.XX.XX:XXX/" name="XXX" review="XXX.XXX.XX.XX:XXXX" />
  <remote fetch="git@XXX.XXX.XX.XX:XXX/" name="XXX" />

  <project groups='XXX' remote="XXX" revision="XXX" name="XXX" path="XXX">
    <copyfile dest="XXX" src="XXX" />
    <linkfile dest="XX/XX/" src="XXX"/>
  </project>
  
  <project remote="XXX" revision="XXX" name="XXX" path="XXX" />
  <repo-hooks enabled-list="post-sync" in-project="XXX/repohooks"/>
</manifest>

下面简单说明下default.xml中常用的参数:
default:default标签定义的属性,将作为标签的默认属性,在标签中,也可以重写这些属性。

  1. revision:默认分支
  2. remote:默认的远程版本库名称
  3. sync-j:表示在同步远程代码时,并发的任务数量

remote:描述了远程仓库的基本信息

  1. name:远程仓库的名称,通常我们看到的命名是origin
  2. fetch:git库地址
  3. review:用作code review的server地址

project:每一个repo管理的git库,就是对应到一个标签

  1. path:把代码下载到指定目录下
  2. name:该项目远程版本库的相对路径的名字
  3. groups:该项目远程版本库所属组
  4. revision:单独指定分支
  5. remote:单独指定远程版本库名称
  6. copyfile:project元素下的子元素copyfile,定义clone后从src到dest拷贝操作。
  7. linkfile:project元素下的子元素linkfile,定义clone后dest到src的软连接。

repo-hooks:repo钩子,in-project下面应该有一个与钩子同名的python文件。因此,如果您想支持预上传钩子,您需要创建一个名为post-sync.py的文件。Repo将在处理钩子时动态加载该模块,然后调用其中的主函数。

  1. in-project:定义挂钩的项目。该值必须与先前定义的元素的name属性(而不是属性)匹配。
  2. enabled-list:要使用的钩子列表,空格或逗号分隔。

repo 原理浅析

repo init执行过程,是会先在本地获取repo仓库,然后会去manifest仓库获取子项目仓库的元信息,进而去访问我们所需要的子项目仓库。
执行repo init -u <url>这里指定的url实际上就是manifest仓库的地址。执行这句运行了两个操作,安装了repo仓库和manifest仓库。repo init命令后面通过-b指定要在Manifest仓库中checkout出来的分支。
如果在执行repo sync命令时,没有指定–local-only选项,那么就下载远程仓库更新到本地仓库来。
repo脚本执行过程讲解可以参考:https://blog.csdn.net/sunjing_/article/details/93496344

常用命令

命令注释
repo init -u <url> -b <branch>初始化,-u指定manifest项目清单库地址,-b指定manifest仓库的分支,不指定分支会选择默认的分支
repo sync同步代码
repo start <branch> <project>创建并切换分支,类似git checkout -b
repo checkout <branch> <project>切换分支,类似git checkout。检出之前由repo start创建的分支。
repo status <project>状态查询,用于查看指定仓的工作空间,类似git status,如果不添加参数,则是查看所有仓 。
repo branchs <project>分支查询,类似git branch
repo diff <project>文件对比,类似git diff
repo upload <project>上传代码,将本地的新增或者修改代码上传到远程服务器。执行repo upload之前,需保证代码已经commit。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐