repo使用

前言

在使用repo前,首先应该知道repo是什么,如何工作的。当然,不清楚这些,知道怎么用也可以满足工作需要,只是可能会让你有种迷茫感,或者遇到问题的时候不知道是什么情况,根本无法理解。
一句话解释,repo是一个用python实现的批量操作git仓库的工具。
在android原始代码,每一个模块都是用git来管理的。比如Launcher,Gallery,framework/base等。共计数百个仓库。

举个熟悉点的例子,如果现在有个需求是同时操作mt6575、mt6589、mt6592等多个仓库,可能的操作是建立一个叫work的分支。
苦逼点的方法是一个仓库一个仓库去git branch work,如果共有455个仓库要这样操作,那是真苦逼啊!
正常的码农都会想到写个脚本自动化去做这件事。Google的码农们也是这么想的,于是repo就诞生了。

Repo根据配置文件里列的模块一个一个下载(直接使用git命令),配置文件中列了需要下载的模块名称和仓库地址。

REPO常用命令使用

repo有哪些命令呢?正常情况下在下面路径去数一下就知道有几个命令了。
qualcomm/.repo/repo/subcmds/

下面截图保留了所以命令。

repo使用_第1张图片

下面就工作中常用的命令,做个小结。排列顺序按照下面的路线:
下载代码、建立分支、查看改动、查看文件修改的地方、添加到staging、提交到本地、提交到gerrit

repo help

repo help COMMAND
说明:
用来查看COMMAND的使用方法和作用的。
其实有了help命令,repo的用法已经很清楚了。权威的官方文档。
问题是官方文档都喜欢打官腔,如果不在一个水平线上,理解不到深意。
其次,工作常用的就几个命令而已。
查看有哪些命令可以用repo help -a(直接repo也可),branch和branches是一个东西哈,或者说都是在branches.py中实现

repo使用_第2张图片

repo init

repo init [options]
说明:

init是下载配置文件的。所以需要告诉repo配置文件下载的地址。
repo init -u 配置仓库地址
看一个真实例子:
repo init
-u git://10.120.10.101/q/platform/manifest.git 
--repo-url=git://10.120.10.101/q/tools/repo.git 
-b a
-m a_baseline.xml 

-u 后面是配置仓库地址
--repo-url是repo代码的仓库地址,默认是google的一个地址。理论上可以用默认的,但是国内的网络情况都懂的。如果你本地已经有了当然不会去下载了,只要放置在正确的路径下。
-b 因为配置文件也是用git管理起来的,目前用哪个分支也需要指定的。默认是master
-m 就算指定分支,管理人员针对不同项目需求,制作了很多的配置文件,那么需要明确指出用哪一个配置文件。默认是default.xml

作为coder来说,init后面的参数可以从项目配置人员或者项目管理人员获得,不用操心。

另外,有时候会要修改-b和-m,那么就直接repo init -b XXX ,repo init -m XXX就好。

repo sync

repo sync [...]
说明:

一般我们总是想全部下载的,不用指定project。如果确实只下载其中一些可以在.repo/manifest.xml去查看工程名字。
第一次执行,就是根据配置文件一个工程一个工程去下载,相当于git clone。
以后的执行就是更新了,相当于git pull。

repo start

repo start [--all | ...]
说明:

创建一个新分支,并切换到该分支,可以指定某些project。
这些projec可能涉及到一个新feature,官方术语用了topic。一般情况下,就粗暴的--all好了。相当于git checkout -b
有一点要注意,这里总是从配置文件中指定的版本的基础上创建一个分支,而不管之前在那个分支。
实例:配置文件revision="x_baseline" ,所以start 的分支是在该分支之上建立的。

repo status

repo status [...]
说明:

这个命令的功能和git status几乎一样。只是交互显示上有些区别。用来查看有哪些文件被修改,添加,删除。

repo diff

repo diff [...]'
说明:

功能类似git diff 。git diff 很灵活,后面可以参数。repo diff 后面没有参数,结果是所以不一样的地方都输出。

repo stage

repo stage -i [...]
说明:

参数-i是必须的,是interactive的意思。个人觉得比较难用。也许是没领悟精髓,^_^
具有类似git add、git revert、git status等功能。 

repo forall

repo forall [...] -c [...]
说明:

对project执行shell命令。所以这个是一个万金油命令。
明显这里的command可以是git XXX。所以如果repo没有实现的功能,就可以用这个命令加git组合一下。
repo中没有类似git commit的命令,故这里用repo forall -c git commit 替代。
其它的命令统统可以如此。

repo upload

repo upload [--re --cc] []
说明:

repo upload相当于git push,重要的区别是upload是把代码推向代码审查服务器。在我们的项目中,coder是感觉不到这个区别的。

后记

Repo并不是一个版本管理工具,不会取代git,但是它是对git的封装,方便了对多个git版本库的管理。
因此要很好的理解repo,首先应该对git有深入的认识。版本管理的历史可以问问度娘,谷哥。
如果从实用的角度出发,作为coder更关心的是怎么使用几个常用命令。如果是高效点的coder,可能还会学习一些实用技巧。
本人出于对repo好奇,同时也是想验证下repo工作方式是否与所想的一致,于是翻了下repo源码。
发现使用了很多git低层命令(Plumbing),真正做事的其实还是git,所以需要对git有比较好的了解。
这里吐血推荐两份参考资料。 
《Progit.zh》 
《git权威指南》

你可能感兴趣的:(repo使用)