近几年公司开始用repo管理代码,对于用惯了git的自己来说刚开始接触不太适应,尤其是关于它里面manifest的概念不理解,不明所以。在网上狠搜了一些文档后再加上自己实际应用才渐渐清楚了它的工作原理。这里写这篇文档总结一下,以免以后忘记。
什么是repo
repo基于git 的工具,它用来管理多个git代码库。 其实git是一个非常不错的代码版本控制工具,具有分布式的优点,执行速度快。 但是随着代码规模的增大,把所有的代码用一个git库管理已经越来越力不从心。这个时候的一个很自然的思路就是分而治之,把整个project按模块分成一个个单独的git库,再用一个统一的工具管理,repo因此应运而生。
从init开始
repo初始化命令的一般形式是:
repo init -u git://xxx/xxx/manifest.git -b <BRANCH> -m <MANIFEST>
这里主要包括三个参数:
- -u: 指定manifest库的url.
- -m: 从manifest库中指定一个manifest文件。如果没有指定,默认是default.xml.
- -b: 指定一个revision, 其实就是一个git branch。
这里首先需要理清的一个概念是,repo的manifest文件也是由一个git管理的。repo init完成后,并不会下载我们关注的git代码库,而是会在当前目录下初始化一个.repo目录,里面有一个manifests目录,这个目录就是一个git库,manifest文件都放在这个目录下。 manifest文件定义了我们初始化的这个repo包含哪些git库,以及这些git库的分支。 后面当我们执行repo sync时,才会根据这个manifest文件来真正去下载各个git代码库。
manifest 文件
说了不少,下面让我们来看一下manifest文件内容:
richard@my-machine:~/dev/test/.repo/manifests$ cat default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="git://xxx/xxx/" name="origin" review="just-test.auto.awesome.com"/>
<default remote="origin" revision="master" sync-c="true" sync-j="5"/>
<!-- Platform Zone -->
<project
name="myawesomemodule"
revision="master"
path="release"
groups="default,release-areas">
</project>
这里的project就是我们关注的git代码库,一个manifest文件可以包括多个project元素,path指定这个库放在哪里,revision指定了我们要用git库的哪个分支。
对于manifest文件每个element的意思这里就不具体解释了,感兴趣可以参考https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md
repo sync
下一步,执行repo sync 就会开始下载我们想要的代码了。
总结
repo init 命令指定了manifest,manifest文件指定当前repo的git库,例如从哪里下载这些git库,放在本地的什么地方,以及处在哪个分支上。