Repo的理解及用法小结(1)

时间:2023-01-29 16:05:59

对Repo的理解及用法小结

Repo介绍

随之移动终端设备的普及,各企业越来越重视Android市场,而研究Android系统的底层驱动开发,首先需要做的便是建立一套Android版本库管理机制。Android使用Git进行代码管理,而Repo命令行工具对Git命令进行了封装,可以管理多个git项目,从而更好地对代码进行集中式管理。

Repo是Google用Python脚本写的调用Git的脚本(可以在Google Group 上找到相关文档资料),用于下载、管理Android项目的软件仓库。Repo主要包含Repo配置信息以及Repo锁管理的Git项目集合。

Repo用法

安装Repo

注:下载Repo只针对第一次使用。
首先,确认主目录下存在 bin/ 目录并已包含在路径中:

mkdir ~/bin
PATH=~/bin
:$PATH

下载Repo工具并设置可执行的权限:

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

注:在Repo设置成功后,会出现下列提示,说明可以进行初始化了。

error: repo is not installed. Use “repo init” to install it here.

Repo初始化 (init)

首先创建目录用于存放工程文件:

mkdir WORKSPACE
cd WORKSPACE

之后,使用命令进行初始化:

repo init -u URL [OPTIONS]

具体操作有:

-u:指定一个URL,其连接到一个manifest仓库。
-m:在manifest仓库中选择一个 NAME.xml 文件。
-b:选择一个manifest仓库中一个特殊的分支。
注:
· 如果不提供 -b REVISION 或者 –manifest-branch=REVISION参数,则检出 manifest Git 库的 master 分支。
· 如果不提供 -m NAME.xml 或者 –manifest-name=NAME.xml 参数,则使用缺省值 default.xml。

在初始化完成后,输入ls命令:

ls repo

可以看到相关文件:manifests/ manifests.git/ manifest.xml repo/

(*) .repo:Repo目录,可用于提取相应项目工作目录到外面的repo工作目录。
(*) .repo/manifests.git:Repo配置信息的Git库,不同版本包含不同配置信息。
(*) .repo/manifests:Repo配置信息的工作目录(将配置信息的工作目录和相应的实际Git目录分离管理,并且配置信息中的.git目录实际只是指向实际Git库的软连接),其中可能包含一个或多个xml文件描述的配置。每个xml文件是独立的一套配置,配置内容包括当前Repo工作目录包含哪些Git项目、所有Git项目所处的默认公共分支、以及远端地址等。
(*) .repo/manifest.xml:Repo工作目录中的内容同一时刻只能采用manifests中的一个xml文件做为其配置,该文件就是其软连接,通过init的-m选项指定采用哪个文件;另外,同一xml文件也可能处于manifests库的不同版本或者不同分支,通过init的-b选项指定使用manifests中的哪个分支,每次init命令都会从服务器更新最新的配置。
(*) .repo/repo:Repo脚本集的Git库,这里包含Repo命令所需的所有子命令脚本实现,由Python完成,这个目录本身又由Git来管理。

Repo同步 (sync)

下载当前repo配置的所有项目,并生成对应的repo工作目录:

repo sync

如果想生成特定项目的代码,则使用下列语句:

repo sync [<project>...]

实现参照清单.repo/manifests.xml克隆并同步版本库,如果版本库不存在,则相当于执行

git clone

如果版本库已经存在,则相当于执行

#对每个remote源进行fetch操作
git remote update
#针对当前分支的跟踪分支进行rebase操作
git rebase/origin/branch

同步涉及到的参数有:

-j:开启多线程同步操作,会加快sync命令的执行速度。默认情况下,使用4个线程并发进行sync。
-c, –current-branch:只同步指定的远程分支。默认情况下,sync会同步所有的远程分支,当远程分支比较多的时候,下载的代码量就大。使用该参数,可以缩减下载时间,节省本地磁盘空间。
-d, –detach:脱离当前的本地分支,切换到manifest.xml中设定的分支。在实际操作中这个参数很有用,当我们第一次sync完代码后,往往会切换到dev分支进行开发。如果不带该参数使用sync, 则会触发本地的dev分支与manifest设定的远程分支进行合并,这会很可能会导致sync失败。
-f, –force-broken:当有git库sync失败了,不中断整个同步操作,继续同步其他的git库。
–no-clone-bundle:在向服务器发起请求时,为了做到尽快的响应速度,会用到内容分发网络(CDN, Content Delivery Network)。同步操作也会通过CDN与就近的服务器建立连接, 使用HTTP/HTTPS的$URL/clone.bundle来初始化本地的git库,clone.bundle实际上是远程git库的镜像,通过HTTP直接下载,这会更好的利用网络带宽,加快下载速度。

同步完成后,.repo下多了projects目录,,原工作目录下也多了目录:

(*) .repo/projects:Repo所管理的所有Git项目集,包含Repo当前配置所指定的所有Git项目对应的Git目录。
(*) .repo/../ :Repo的工作区。在Repo目录(即.repo)之外,根据Repo配置(即.repo/manifest.xml文件),从.repo/projects下提取出指定分支的各个Git项目(即.repo/projects中Git项目的子集)的工作目录,形成Repo工作目录,可供开发使用。

注:以上内容参考链接

http://blog.chinaunix.net/uid-9525959-id-4534319.html
http://www.360doc.com/content/14/0220/17/97538_354256755.shtml