repo仓库配置搭建及基础命令学习

一: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>

posted @ 2018-03-14 21:49  君临裙下  阅读(17575)  评论(0编辑  收藏  举报