<manifest>
<remote fetch="ssh://10.XX.XX.XX" name="origin" review="10.XX.XX.XX:8090"/>
<default remote="origin" revision="develop" sync-j="4"/>
<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 name="XXX/repohooks" path="XXX/XXX" remote="origin" revision="develop"/>
<repo-hooks enabled-list="post-sync" in-project="XXX/repohooks"/>
</manifest>
常用参数:
<remote>:描述了远程仓库的基本信息。
name:远程仓库的名称,通常我们看到的命名是origin
fetch:git库地址
review:用作code review的server地址
<default>:default标签定义的属性,将作为<project>标签的默认属性,在<project>标签中,也可以重写这些属性。
revision:默认分支
remote:默认的远程版本库名称
sync-j:表示在同步远程代码时,并发的任务数量
<project>:每一个repo管理的git库,就是对应到一个<project>标签
path:把代码下载到指定目录下
name:该项目远程版本库的相对路径
groups:该项目远程版本库所属组
revision:单独指定分支
remote:单独指定远程版本库名称
<project><copyfile>:project元素下的子元素copyfile,定义clone后从src到dest拷贝操作。
<project><linkfile>:project元素下的子元素linkfile,定义clone后dest到src的软连接。
<repo-hooks>:repo钩子,in-project下面应该有一个与钩子同名的python文件。因此,如果您想支持预上传钩子,您需要创建一个名为post-sync.py的文件。Repo将在处理钩子时动态加载该模块,然后调用其中的主函数。
in-project:定义挂钩的项目。该值必须与先前定义的元素的name
属性(而不是属性)匹配。
enabled-list:要使用的钩子列表,空格或逗号分隔。
repo对git命令进行了封装,提供了一套repo的命令集(包括init, sync等),所有repo管理的自动化实现也都包含在这个git库中。在第一次初始化的时候,repo会从远程把这个git库下载到本地。在repo的引导脚本中指定了repo脚本库的地址。
。。。。
repo init -u <URL> [<OPTIONS>]
-u:指定manifest项目清单库地址。
-m,–manifest-name:指定manifests库中的清单文件,默认为maniftests/default.xml。
-b, –manifest-branch:指定manifest仓的分支,默认为master分支。
-g:指定manifests库中的组来下载代码,默认为all。
不常用参数:
–repo-url:指定远程repo库地址,当引导脚本中的地址不可访问时,可以通过该参数指定可访问的repo地址。
–repo-branch:同manifest这个git库一样,repo这个git库也是有版本差异的,可以通过该参数来指定下载repo这个远程git库的特定分支。
–no-repo-verify:在下载repo库时,会对repo的源码进行检查。通过–repo-url指定第三方repo库时,可能会导致检查不通过,所以可以配套使用该参数,强制不进行检查。
--depth {number}:限制下载记录次数,加速代码下载。
repo sync [PROJECT_LIST]
常用参数:
-j:开启多线程同步操作,这会加快sync命令的执行速度。该参数在default.xml中有默认设置。
-c, –current-branch:只同步指定的远程分支。默认情况下,sync会同步所有的远程分支。
不常用参数:
-d, –detach:脱离当前的本地分支,切换到manifest.xml中设定的分支。
-f, –force-broken:当有git库sync失败了,不中断整个同步操作,继续同步其他的git库。
–no-clone-bundle:在向服务器发起请求时,为了做到尽快的响应速度,会用到内容分发网络(CDN, Content Delivery Network)。
命令说明:
下载远程代码,并将本地代码更新到最新,这个过程称为“同步”。如果不使用任何参数,那么会对所有repo管理的git仓进行同步操作;也可以通过使用PROJECT_LIST参数,指定若干要同步的PROJECT。 根据本地git库代码不同,同步操作会有不同的行为:
当本地的git库是第一次触发同步操作时。该命令等价于git clone
,会将远程git库直接拷贝到本地。
当本地已经触发过同步操作时。该命令等价于git remote update && git rebase origin/<BRANCH>
,<BRANCH>就是当前与本地分支所关联的远程分支。在代码合并时可能会产生冲突,当冲突出现时,只需要解决完冲突,然后执行git rebase --continue
即可。
repo upload [PROJECT_LIST]
命令说明:
将本地的新增或者修改代码上传到远程服务器。upload命令首先会找出本地分支从上一次同步操作以来发生的改动,然后会将这些改动生成Patch文件,上传至Gerrit服务器。 如果没有指定PROJECT_LIST,那么upload会找出所有git库的改动;如果某个git库有多个分支,upload会提供一个交互界面,提示选择其中若干个分支进行上传操作。
执行repo upload之前,需保证代码已经commit。
不常用参数:
-re
当有多个git库的改动提交时,为了避免在网页上频繁的填选Reviewer这种重复劳动, upload提供了–re, –reviewer参数,在命令行一次性指定Reviewer。
repo forall [PROJECT_LIST] -c <COMMAND>
常用参数:
-c:后面可以带的任何可以被系统支持的shell命令
-p:在shell命令输出之前列出项目名称
-v:列出执行shell指令输出的错误信息
该命令还可以添加环境变量:
环境变量参数:
REPO_PROJECT:指定项目的名称
REPO_PATH:指定项目在工作区的相对路径
REPO_REMOTE:指定项目远程仓库的名称
REPO_LREV:指定项目最后一次提交服务器仓库对应的哈希值
REPO_RREV:指定项目在克隆时的指定分支,manifest里的revision属性
如果-c后面的shell指令是上述的环境变量,则需要用单引号把shell命令括起来使用。
打标签:
repo forall -c git tag 标签名
repo start <BRANCH_NAME> [<PROJECT_LIST>]
repo start 的实质就是对git checkout -b 的封装
常用参数:
--all:对所有的PROJECT都执行分支切换操作
repo checkout <BRANCH_NAME> [<PROJECT_LIST>]
该命令实际是对git checkout命令的封装。检出之前由repo start创建的分支。
repo status [<PROJECT_LIST>]
用于查看指定仓的工作空间,类似于git status,如果不添加参数,则是查看所有仓 。
说明:
每个小节的第一行显示的是项目名称和所在的分支名称
每个小节的第二行的第一个字母表示暂存区文件修改的状态
-:没有改变
A:添加(不在HEAD中,在暂存区中)
M:修改(在HEAD中,在暂存区中,内容不同)
D:删除(在HEAD中,不在暂存区)
R:重命名(不在HEAD中,在暂存区,路径修改)
C:拷贝(不在HEAD中,在暂存区,从其他文件拷贝)
T:文件状态改变(在HEAD中,在暂存区,内容相同)
U:未合并,需要冲突解决
每个小节的第二行的第二个字母表示工作区文件的更改状态
-:新/未知(不在暂存区,在工作区)
m:修改(在暂存区,在工作区,被修改)
d:删除(在暂存区,不在工作区)
repo branches [<PROJECT_LIST>]
命令说明:
读取各个项目的分支列表并汇总显示。可指定只读取某一项目的列表。
repo diff [<PROJECT_LIST >]
命令说明:
该命令实际是对git diff命令的封装。用于显示各项目工作区下的文件差异,可指定只显示某一项目工作区下的文件差异。
repo download <TARGET> <CHANGE>
命令说明:
download是从Gerrit下载改动代码。
<TARGET>:指定要下载的PROJECT,譬如Tapp/eCommApp
<CHANGE>:指定要下载的改动内容的change_number。
repo prune [<PROJECT_LIST>]
命令说明:
删除指定PROJECT中,已经合并的分支。当在开发分支上代码已经合并到主干分支后,使用该命令就可以删除这个开发分支。随着时间的演进,开发分支会越来越多,在多人开发同一个git库,多开发分支的情况会愈发明显,假设当前git库有如下分支:
* master dev_feature1_201501 # 已经合并到master dev_feature2_201502 # 已经合并到master dev_feature3_201503 # 正在开发中,还有改动记录没有合并到master
那么,针对该git库使用prune命令,会删除dev_feature1_201501和dev_feature2_201502。
repo stage –i [<PROJECT_LIST >]
命令说明:
该命令实际是对git add --interactive命令的封装,用于将项目工作区中的改动添加到暂存区。
repo abandon <branchName> [<PROJECT_LIST > ]
命令说明:
该命令实际是对git branch -D命令的封装。作用是删除分支。
repo manifest -r -o %s_manifest.xml
常用参数:
-r:保存当前分支revisions。
-o NAME.xml:输出xml文件名。
命令说明:
用于显示manifest文件内容。
命令说明:
用于显示repo版本号。