repo是谷歌用python脚本写的调用git的一个脚本,并不是用于取代git,它简化了对多个git版本库的管理。用repo管理的版本库都需要使用git命令来进行操作。
大型项目模块化/组件化之后,各模块也作为独立的 git 仓库从主项目里剥离了出去,各模块各自管理自己的版本。每一个子项目都是一个git仓库,每个git仓库都有很多分支版本,为了方便统一管理各个子项目的git仓库,需要一个上层工具批量进行处理,因此诞生了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也建立一个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标签定义的属性,将作为标签的默认属性,在标签中,也可以重写这些属性。
remote:描述了远程仓库的基本信息
project:每一个repo管理的git库,就是对应到一个标签
repo-hooks:repo钩子,in-project下面应该有一个与钩子同名的python文件。因此,如果您想支持预上传钩子,您需要创建一个名为post-sync.py的文件。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。 |