一:repo简介
Android使用Git进行代码管理,而Repo命令行工具对Git命令进行了封装,是在Git之上构建的工具(它其实是一个python脚本),方便管理多个git项目,从而更好地对代码进行集中式管理。
repo使用过程分如下几步:
1.运行repo init 命令,克隆Android的一个清单库,这个清单库是通过xml文件建立的版本清单库。
2.清单库中的manifest.xml文件,列出了各个版本库克隆所需要的参数信息;包括版本库的地址、工作区定义的目录结构,以及分支的对应关系。
3.运行repo sync的命令,开始同步,即分别克隆xml文件中的版本库数据到本地的工作区中。
4.对各个版本库进行切换分支操作,切换到某个分支操作提交并push到远程。
【【【主要操作步骤见红色字体;请确保操作如下步骤之前在gerrit.dd.net的个人账号下配置了本地机器的ssh public key】】】
二:配置ssh config
按如下方式在~/.ssh/config里配置:(若没有config文件需要新建)
Host gerrit.dd.net
HostName gerrit.dd.net
User 你的gerrit账户名
IdentityFile ~/.ssh/id_rsa
PubkeyAuthentication yes
三:安装repo:下载Repo只针对第一次使用。
1. 确认主目录下存在 bin/ 目录并已包含在路径中:mkdir ~/bin PATH=~/bin:$PATH
2.下载Repo工具并设置可执行的权限: curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo
3.这里的repo只是一个引导脚本而不是直接称之为repo,因为repo大部分功能代码都不在其中,下载的只是帮助这个repo程序继续下载和加载的工具。
注:修改repo脚本参数的repo_url :REPO_URL ='ssh://gerrit.dd.net:29418/git-repo'
四:repo和清单库的初始化
下载并保存repo引导脚本后,建立一个工作目录,这个工作目录将作为Android工作区目录。在工作目录中执行repo init -u <url>,完成repo完整的下载及项目清单版本库的下载。
mkdir workspace cd workspace repo init -u ssh://gerrit.dd.net:29418/manifest --no-repo-verify (注意:manifest仓库地址需要研发组内给出)
命令repo init要完成如下操作:
1.完成repo工具的完整下载,现在仅有的不过是repo 的引导程序。初始化操作会从repo脚本里设定的镜像地址中克隆repo.git库到当前的目录下。一个隐藏的.repo目录。
2.克隆创建的清单库manifest.git(地址来自与-u参数),清单库实际上只包含一个default.xml文件,这个XML文件定义了多个版本库和本地地址的映射关系,是repo工作的指引文件。
3.克隆的清单库位于.repo/manifests.git中,本地克隆到.repo/manifests。自己新建的git仓库里边就放了个简单的default.xml文件:ssh://gerrit.dd.net:29418/manifest
repo引导脚本的init子命令可以使用下列和清单库相关的参数:
-u:指定一个URL,其连接到一个maniest仓库
-m :在manifest仓库中选择一个xml文件
-b:选择一个maniest仓库中的一个特殊的分支
--repo-url:设定repo的版本库地址。
--repo-branch:设定需要检出的分支。
--no-repo-verify:设定不要对repo的里程碑签名进行严格的验证。
--mirror:只在repo第一次初始化的时候使用,建立本地镜像
五:同步项目
repo sync 默认同步xml文件中定义的所有仓库,可以单独指定sync哪个或哪些仓库: repo sync name1 name2
如果某个工程从未同步过,repo sync相当于git clone。所有远程仓库的分支都会被拷贝到本地仓库。
如果工程已经同步过,repo sync相当于: git remote update git rebase origin/branch
(注:branch是本地工程目录当前分支。如果当前分支不是远程仓库任意分支的跟踪分支,那么这个工程不会发生同步。相反,就会进行合并操作。合并中有冲突,使用Git相关命令处理。)
六:修改提交并push到远程
cd进入到sync到本地的某个分支仓库目录,修改提交,git branch发现仓库都是no branch状态:push到远程时用命令:git push origin HEAD:master
七:repo常用命令
a . repo init
b . repo sync
c . repo upload [ project-list ] :上传修改的代码 ,如果你本地的代码有所修改,那么在运行 repo sync 的时候,会提示你上传修改的代码,所有修改的代码分支会上传到 Gerrit (基于web 的代码review 系统), Gerrit 受到上传 的代码,会转换为一个个变更,从而可以让人们来review 修改的代码。
d . repo diff [project list]:显示提交的代码和当前工作目录代码之间的差异
e . repo download :
f . repo forall -c “command”:这个命令会遍历所有的git仓库,并在每个仓库执行-c所指定的命令(这个被执行的命令就不限于仅仅是git命令了,而是任何被系统支持的命令,比如:ls 、 pwd 、cp 等)
例如:repo forall –c “echo $REPO_PATH” repo forall –c “git reset –hard HEAD” 环境变量: REPO_PROJECT REPO_PATH REPO_REMOTE
g . repo prune [project list]: 实际上是对git branch –d命令的封装,该命令用于扫描项目的各个分支,并删除已经合并的分支,
h . repo start newbranchname [project list] :在指定工程仓库创建一个当前所在远程分支的跟踪分支,并切到跟踪分支。
i . repo status [project list] :显示当前工作目录的状态或指定工程名或者工程路径的状态。
j . repo manifest -o default.xml -r :获取仓库的sha1值,并记录在一个新的default.xml文件中
default.xml 示例:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<! -- remote元素设置远程服务器属性,可以为多个:name设置远程服务器名,用于git fetch,git remote等操作;fetch 所有project的git url前缀;指定gerrit的服务器名,用于repo upload操作 -->
<remote name="origin" fetch="gerrit.dd.net" review="http://gerrit.dd.net"/>
<! -- default元素设定所有peoject的默认属性值:revision为git分支名,如master或refs/heads/master;remote为某一个remote元素的name属性值,用于指定使用哪一个远程服务器;sync-j为sync操作时的线程数-->
<default revision="master" remote="origin" sync-j="4" />
<! -- project元素指定一个需要clone的git仓库:path指定clone出来的git仓库在本地的地址;name唯一的名字表示project,用于拼接生成项目 git仓库的url;revision:指定需要获取的git提交点,可以定义成固定的branch,或者是明确的commit 哈希值 -->
<project path="fanxiao/fanxiaotest1" name="MA/Applications/app-a" revision="master" />
<project path="fanxiao/fanxiaotest2" name="MA/Applications/app-b" revision="52cf9185ff1d" />
<project path="fanxiao/fanxiaotest3" name="fanxiaotest" revision="master"/>
</manifest>