一、概述
REPO是GOOGLE用Python脚本写的调用GIT的一个脚本,主要是用来下载、管理Android项目的软件仓库。
首先REPO是我们以 GIT为基础构建的代码库管理工具。REPO可以在必要时整合多个GIT代码库,将相关内容上传到我们的修订版本控制系统,并自动执行Android开发工作流程的部分环节。
REPO并非用来取代GIT,只是为了让您在 Android 环境中更轻松地使用GIT。
上一章节中,介绍了GIT版本控制的使用。 本章节介绍下REPO工具组的使用。并且通过REPO构建一个自己的版本库。
二、REPO基本命令
2.1 repo命令下载
$ git clone https://github.com/friendlyarm/repo--depth 1 tools
$ git clonehttps://mirrors.tuna.tsinghua.edu.cn/git/git-repo
$ git clone http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo
2.2 repo常用命令
2.2.1 init
在当前目录中安装Repo。这会创建一个 .repo/ 目录,其中包含用于 Repo 源代码和标准 Android 清单文件的Git 代码库,还包含 manifest.xml 这是一个指向 .repo/manifests/ 目录中所选清单的符号链接(也就是默认的 default.xml)
/* 初始化命令
* URL:指定 manifest 仓库地址
* 参数:
* -u: 指定连接到的 manifest 仓库地址
* -m:选择仓库中某个 manifest 文件,如果没有设置,就使用 default.xml
* -b: 选择一个 manifest 仓库中的一个特殊的分支或修正版本
*/
repo init -u <URL> [<OPTIONS>]
2.2.2 sync
下载新的更改并更新本地环境中的工作文件。如果在未使用任何参数的情况下运行repo sync,则该操作会同步所有项目的文件
运行 repo sync 后,出现以下情况:
如果目标项目从未同步过,则 repo sync 相当于 git clone 。远程代码库中的所有分支都会复制到本地项目目录中
如果目标项目已经同步过,则 repo sync 相当于以下命令
$ git remote update
$ git rebase origin <BRANCH>
其中 <BRANCH> 是本地项目目录中当前已检出的分支。如果本地分支没有跟踪远程代码库中的分支,则相应项目不会发生任何同步
如果git rebase操作导致合并冲突,那么需要使用普通 Git 命令(例如 git rebase --continue)来解决冲突
/* 拉代码命令
* 参数:
* -j: 多任务,一般8核心可以开到16任务,过多会起反作用
* -c: 只下载当前分支代码
* -d: 让工程回退到manifest指定的版本
* -f: 如果某个工程同步失败,继续同步
* -s: 同步到当前清单服务器元素指定的一个已知的良好版本
*/
$ repo sync
$ repo sync -c -j4
2.2.3 upload
对于指定的项目,Repo 会将本地分支与最后一次 repo sync 时更新的远程分支进行比较。Repo 会提示选择一个或者多个尚未上传以供审核的分支
选择一个或多个分支后,所选分支上的所有提交都会通过 HTTPS 连接传输到 Gerrit
/* 提交修改
* 参数:
* --reviewer: 指定Reviewer的邮箱地址
*/
repo upload --reviewer="xxx"
2.2.4 start
从清单中指定的版本开始,创建一个新的分支进行开发。实际上就是 gitcheckout -b命令的封装,以清单文件中的分支为基础,在本地创建新的分支
repo start 与 git checkout -b 的区别:
repo start 是在清单文件设定的分支基础上创建新的分支
git checkou -b 是在当前所在分支的基础上创建新的分支
如果清单文件中设定的分支是 remoteBranchName, 创建新的分支 localBranchName
为单个项目创建 localBranchName 分支
repo start localBranchName 项目绝对路径
为所有项目创建 localBranchName 分支
repo start localBranchName –all
2.2.5 forall
$ repo forall –c git …..
对由repo管理的git库进行操作,
如repo forall –cgit checkout 45451
所有库检出45451分支与远程45451分支对应(若无,则跳过)
2.2.6 checkout
$ repo checkout <branchname> [projectname] //等同于带项目参数的git checkout
2.2.7 branch
$ repo branch[projectname] //读取项目分支的情况
2.2.8 version
$ repo version //显示repo版本
2.2.9 其他
$ repo abandon <branchname> [projectname] //删除指定项目的指定分支,强制删除不管是否有合并,等同git branch –D
$ repo status [projectname] //显示分支及修改情况
三、REPO构建自己的版本库
repo通过manifest.xml来同步代码,xml文件内容如下:
<manifest>
<remote fetch="ssh://gitserver"name="origin" review="http://gerrit:8080"/>
<defaultrevision=“master” remote=“origin” />
<projectpath="build" name="platform/build"/>
<projectpath="abi/cpp" name="platform/abi/cpp" />
<projectpath="bionic" name="platform/bionic" />
<projectpath="bootable/bootloader/lk" name="kernel/lk" />
下面以T7 Linux SDK为例,先列出T7 BSP的目录组织架构:
方便管理先做七个仓库(可以视情况而定):
t7linux-auto.git ->仓库存储build.shcomp_qtLib-590_only.sh comp_uboot_boot0_only.sh update_kernel.bat
brandy.git ->uboot等其他
buildroot-201611.git ->rootfs相关
doc.git ->文档相关
linux-3.10.git ->kernel相关
tools.git ->tool相关
manifest.git ->用来repo init时候指定规则,且只有一个文件default.xml
3.1 服务端空仓库搭建
选择合适目录下创建:
$ mkdir t7linux-auto.git
$ mkdir brandy.git
$ mkdir buildroot-201611.git
$ mkdir doc.git
$ mkdir linux-3.10.git
$ mkdir tools.git
$ mkdir manifest.git
3.2 服务端空仓库初始化
$ cd t7linux-auto.git && git init --bare .git
$ cd brandy.git && git init --bare .git
$ cd buildroot-201611.git && git init --bare.git
$ cd doc.git && git init --bare .git
$ cd linux-3.10.git && git init --bare .git
$ cd tools.git && git init --bare .git
$ cd manifest.git && git init --bare .git
3.3 上传代码到服务器各.git仓库中
此操作可以在服务器或本机操作。
仓库一:
$ git init
$ git add build.sh comp_qtLib-590_only.shcomp_uboot_boot0_only.sh update_kernel.bat
$ git commit –a –m “some commit logs.”
$ git remote add master username@serverip:/t7linux-auto.git ->设置远程仓库,使用的ssh协议
username:用户名 serverip:服务器ip地址
$ git push master --all
仓库二:
$ cd brandy && git init && git add ./*&& git commit -a -m "some commit logs."
$ git remote add master username@serverip:/ brandy.git
$ git push master --all
buildroot-201611.git、doc.git、linux-3.10.git、tools.git操作与以上类似…
……………..
仓库七:
$ mkdir repo
$ cd repo
新建一个default.xml文件,编辑如下:
$ vim default.xml
<?xml version="1.0"encoding="UTF-8"?>
<manifest>
<remote fetch="ssh://username@serverip:/home/username /repo" name="origin"/>
<default remote="origin" revision="master"/>
<project path=" t7linux-auto "name=" t7linux-auto "/>
<project path=" t7linux-auto /brandy"name="brandy"/>
<project path=" t7linux-auto/buildroot-201611" name="buildroot-201611"/>
<project path=" t7linux-auto /doc"name="doc"/>
<project path=" t7linux-auto /linux-3.10"name="linux-3.10"/>
<project path=" t7linux-auto /tools"name="tools"/>
</manifest>
$ git init && git add default.xml &&git commit -a -m " some commit logs."
$ git remote add masterusername@serverip:/home/username/repo/manifest.git
$ git push master –all
3.4 客户端下载代码
下载repo命令:
$ curlhttp://php.webtutor.pl/en/wp-content/uploads/2011/09/repo > /opt/bin/repo
初始化仓库:
$ repo init -ussh://username@serverip:/home/username/repo/manifest -b master
(可以指定不同的远程分支来针对应用、bsp人员权限管理)
3.5 同步
$ repo sync
$ repo start master --all