0 Star 3 Fork 0

极简美 / repo_tutorial

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

repo多仓库管理工具

Android使用Git作为基础的代码管理工具。Google开发了Gerrit进行代码审核以便更好的对代码进行集中式管理,还开发了repo命令行工具,对Git部分命令进行封装,用于管理Android项目,可将百多个Git仓库有效的进行组织。repo并不是用来取代Git,而是用PythonGit进行了一定的封装,简化了对多个Git版本仓库的管理。

参考资料:

一、repo安装

repo工具的git-repo仓库获取方式为:

git clone https://github.com/esrlabs/git-repo.git
  1. 获取git-repo源码到本地路劲,比如/opt/git-repo
  2. 拷贝git-repo源码中的repo工具到`/home/user/bin/rep目三、录,并赋予可执行权限;
  3. 修改/home/user/bin/repo脚本中的REPO-URL链接指向本地的/opt/git-repo即可正常使用了

二、repo命令使用

2.1 初始化

mkdir repo_dir && cd repo_dir
repo init -u url -m manifest-file

repo init命令会在当前目录下安装repository,并在当前目录创建一个目录:.repo-u参数指定一个URLrepo将从这个URL指定的repository中取得manifest文件;-m参数可以选择repository中的某一个特定的manifest文件,如果不指定,则为默认的default.xml文件。

2.2 同步git仓库

repo sync
repo sync --force-sync # 强制同步整个仓库

2.3 将所有repo控制的git仓库checkout到远程master分支

repo forall -c git checkout -b master remotes/origin/master

2.4 清除并还原本地修改

repo forall -c 'git clean -df; git checkout .'

2.5 查看工程中所有仓库的修改状态

repo status

2.6 将某个时间段所有仓库修改记录显示出来

repo forall -c git log --name-status --since="2017-02-12" --until="2017-03-01"

2.7 上传修改

repo upload [project-list]

如上命令用于上传修改的代码。如果你本地的代码有所修改,那么在运行repo sync的时候,会提示你上传修改的代码,所有修改的代码分支会上传到Gerrit上,Gerrit受到上传的代码,会转换为一个个变更,从而可以让人们来review修改的代码。

2.8 查看差异

repo diff [project-list]

用于显示提交的代码和当前工作目录代码之间的差异。

2.9 执行command命令

repo forall -c command

对所有的项目执行一个command命令,这个命令相当好用。

三、配置文件详解

配置文件以下面语句开头:

<?xml version="1.0" encoding="UTF-8"?>

整个文档由manifest标签包裹,它是配置的顶层元素:

<manifest>
...
</manifest>

其中主要包含remotedefaultproject三个元素:

  • remote元素用于设定远程服务器的属性,可以为多个,其相关属性如下:
    • name属性用于设置远程服务器名,用于git fetchgit remote等操作;
    • alias属性可以覆盖之前定义的remote namename必须是固定的,但是alias可以不同,可以用来指向不同的remote url
    • fetch属性是所有projectgit url的前缀;
    • review属性用于指定gerrit服务器,用于repo upload操作;
<remote name="origin" fetch="gerrit.dd.net" review="http://gerrit.dd.net"/>
  • default元素用于设定所有project的默认属性值:
    • ·属性用于指定为哪个remote元素设定默认project属性值;
    • revision属性你用于设置git仓库的分支名,如masterrefs/heads/master
    • sync-j属性设定sync操作时的并行线程数;
    • sync-c:如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容;
    • sync-s:如果设置为true,则会同步git的子项目;
<default revision="master" remote="origin" sync-j="4" />
  • project元素用于指定要clonegit仓库:
    • name属性与remotefetch属性一起拼接成项目的git仓库的url
    • path属性指定clone出来的git仓库在本地的路径,如果没有配置则与name一样;
    • remote:定义remote name,如果没有定义的话就用default中定义的remote name
    • resivion属性用于指定获取git的提交点,可以是固定的branch,也可以是明确的commit哈希值;
    • groups:列出project所属的组,以空格或者逗号分隔多个组名;所有的project都自动属于"all"组;每一个project自动属于name:'name'path:'path'组;例如,它自动属于default,name:monkeys,and path:barrel-of组;如果一个project属于notdefault组,则:repo sync时不会下载;
    • sync_c:如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容;
    • sync_s: 如果设置为true,则会同步git的子项目;
    • upstream:在哪个git分支可以找到一个SHA1;用于同步revision锁定的manifest(-c模式);该模式可以避免同步整个ref空间;
    • annotation :可以有0个或多个annotation,格式是name-valuerepo forall命令是会用来定义环境变量;
<project path="fanxiao/fanxiaotest1" name="MA/Application/app-a" revision="master" />
<project path="fanxiao/fanxiaotest2" name="MA/Application/app-b" revision="52cf9185ff1d" />
<project path="fanxiao/fanxiaotest3" name="fanxiaotest" revision="master"/>
  • include元素:
    • name:另一个需要导入的manifest文件名字;可以在当前的路径下添加一个another_manifest.xml,这样可以在另一个xml中添加或删除project
  • remove-project:从内部的manifest表中删除指定的project;经常用于本地的manifest文件,用户可以替换一个project的定义。

有时候manifest中还会包含manifest-server元素。它的url属性用于指定manifest服务的URL,通常是一个XML RPC服务。它要支持一下RPC方法:

  • GetApprovedManifest(branch, target):返回一个manifest用于指示所有projects的分支和编译目标;target参数来自环境变量TARGET_PRODUCTTARGET_BUILD_VARIANT,组成$TARGET_PRODUCT-$TARGET_BUILD_VARIANT
  • GetManifest(tag) :返回指定tag的manifest

四、常见问题

4.1 如何指定xml配置文件?

repo init命令时,通过-m name.xml来指定manifest的名字,比如:

repo init -u https://github.com/AaronKonishi/repo-study.git -m manifest.xml

当不使用-m指定manifest时,默认使用default.xml

4.2 如何指定固定分支?

default元素中,可以为remote指定默认的属性,其中的revision可以指定默认的分支:

<default revision="master" remote="origin" sync-j="4" />

在具体的project元素中,也可以使用revision指定固定的分支,分支可以是tagbranch,或者某次固定的提交:

<project path="fanxiao/fanxiaotest1" name="MA/Application/app-a" revision="master" />
<project path="fanxiao/fanxiaotest2" name="MA/Application/app-b" revision="52cf9185ff1d" />

4.3 如何指定多个远程?

可以在*.xml中指定多个remote元素,但是只能有一个default元素,然后在project元素中,通过remote属性指定要使用哪一个remotefetch。比如:

<?xml version="1.0" encoding="UTF-8"?>

<manifest>
<remote name="gitee" fetch="https://gitee.com/simpost/" />
<remote name="github" fetch="https://github.com/AaronKonishi/" />
<default revision="master" remote="github" />
<project path="source/git-repo" name="git-repo" remote="github" />
<project path="source/repo-study" name="repo-study" remote="github" />

<project path="source/EFSM" name="EFSM" remote="gitee" revision="master" />
</manifest>

空文件

简介

介绍repo仓库管理工具的使用方法 展开 收起
Python
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Python
1
https://gitee.com/simpost/repo_tutorial.git
git@gitee.com:simpost/repo_tutorial.git
simpost
repo_tutorial
repo_tutorial
master

搜索帮助