repo的基本认识

1、定义。

Repo是谷歌用Python脚本写的调用git的一个脚本。主要是用来下载、多个Git仓库。

而Android项目那是由多个git仓库组成的,它有非常多的分支。

如:android/framework/base它就是一个git仓库。

android/packages/apps/Camera(app下面的所有的应用都是单独的git仓库进行的管理)

这样假如你不用repo进行统一管理的话,就说基本的你下载Android源码,难道要一个个的写每个仓库的url?然后下载完

单独的配置每个仓库?单独初始化什么的?显然比较麻烦。

repo 其实就是把相关的git操作命令进行了封装,方便一下操作好几个git仓库.

2、初始化。

安装下载repo脚本,在公司里直接按照公司给的步骤来的,此处不做整理。

接下来就是初始化环境下载代码了。

一般来说为了方便管理,你可以用合适的文件夹名称来存放你要下载的分支代码,然后用在这个文件夹内repo init。

2.1、初始化repo工具脚本,并且从服务器端克隆manifest,这个manifest很关键,repo就是按照它来管理多个git仓库的。

repo init -u URL  -b branch_name : 这是最常用的URL就用公司的服务端地址,branch_name:就是你下载的代码的分

支的名字,因为公司肯定会同时维护好几个分支的代码用于开发。

这个命令就相当于对repo配置和repo脚本集进行git pull,但是它还额外做了更多的事情

命令参数:

-u:指定一个url然后连接到一个manifest库.这个manifest库里面会有所有分支的manifest文件。

-b :选择manifest仓库的一个特殊的分支

-m :选择manifest仓库中的某一个。当有很多个的时候默认default.xml.

最终此命令完成repo工具的完整下载,克隆url对应的清单文件米克隆岛本地的.repo/manifest.xml当中。注意 它只是一个连接

符号,指向了.repo/manifets/default.xml.你要是用-m指向了别处,那么就会连接到对应的.repo/manifests/xxxxx.xml的manifest

当中。

其实,如果不使用repo工具,也是可以对照manifest.xml文件清单直接使用“git clone”的方式一个project一个project的下

载的,然后对每个project进行git checkout特定的分支。

2.2、manifest文件和.repo隐藏文件内的文件的初步介绍。

为了更好的理解repo工具很有必要了解一下上述两个概念。

在你执行repo init -u的目录下,等你执行完命令,会有隐藏文件.repo.通过ls -a查看.

如下:我是建在Projects/n-yoshino/目录下执行的文件

  1. xp022430@cnbjlx24729:~/Projects/n-yoshino$ ls -a
  2. . .repo ... //别的就不写了
  3. xp022430@cnbjlx24729:~/Projects/n-yoshino$ cd .repo/
  4. xp022430@cnbjlx24729:~/Projects/n-yoshino/.repo$ ls -a
  5. . .. manifests manifests.git manifest.xml ...//别的就省略了
  6. xp022430@cnbjlx24729:~/Projects/n-yoshino/.repo$ cd manifests
  7. xp022430@cnbjlx24729:~/Projects/n-yoshino/.repo/manifests$ ls -a
  8. . .. default.xml .git
  9. xp022430@cnbjlx24729:~/Projects/n-yoshino/.repo/manifests$

.repo/manifest.xml是一个软连接就是指向了manifests/default.xml

default.xml的部分代码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <manifest>
  3. <remote fetch="git://review.sonyericsson.net/" name="origin" review="review.sonyericsson.net"/>
  4. <manifest-server url="http://cmweb.sonyericsson.net/rpc?android"/>
  5. <default remote="origin" revision="n-yoshino" sync-j="4"/>
  6. <project name="device/common" revision="refs/tags/AU_LINUX_ANDROID_LA.UM.5.7.R1.07.01.01.253.084"/>
  7. <project name="device/generic/arm64" revision="refs/tags/AU_LINUX_ANDROID_LA.UM.5.7.R1.07.01.01.253.084"/>
  8. ......
  9. <project name="platform/frameworks/av" path="frameworks/av"/>
  10. <project name="platform/frameworks/base" path="frameworks/base"/>
  11. ......
  12. <project name="platform/build" path="build">
  13. <copyfile dest="Makefile" src="core/root.mk"/>
  14. </project>
  15. ......
  16. </manifest>

<remote fetch="git://review.sonyericsson.net/" name="origin" review="review.sonyericsson.net"/>

定义了名为origin的远程版本库,url = git://review.sonyericsson.net/

<manifest-server url="http://cmweb.sonyericsson.net/rpc?android"/> <default remote="origin" revision="n-mr1-yoshino2"

sync-j="4"/>

默认的远程版本库origin,revision代表分支默认的分支 n-mr1-yoshino2.就是你不指定revision的视乎就是它

<project name="platform/frameworks/base" path="frameworks/base"/>

project用于表示一个git项目,也就是git仓库。path:用于表示在工作区的位置,name表示改git仓库的远程相对路径。

此处有个问题没有path的是不是就表示在工作区就没有?工作区ls -a显示的那个电脑上的区域。

<project name="platform/packages/apps/Dialer" path="packages/apps/Dialer"

revision="15146fbef7ea3bbf23e20c6746a4b031fb2765a6" upstream="n-mr1-common"/>

此处的和这个reversion是commitid 了,应该死代表某个分支的最新提交也就是这个分支,设置以后该分支的upstream

就是默认的跟踪分支了!

copyfile 执行拷贝操作,把URL/$src地址的文件拷贝到./$dest

<copyfile dest="Makefile" src="core/root.mk"/>

至于.repo下面的其它文件我们接下来讨论。

3、下载代码

repo sycn :按照.repo/manifest.xml指向的那个xml开始克隆并同步远程版本库中的代码.此时两种情况

1)、如果是第一次克隆本地不存在上面的版本库,那么就相当于git clone.

2)、如果版本库已经存在相当于

git remote update  这个命令对于每一个remote的远程分支进行执行了fetch.

git rebase orignl/branch :对当前所在的分支执行rebase.

repo sync -c 是指当前分支。可以加快下载速度。

也可以克隆某个指定的git仓库,但注意单独克隆的一般没法编译因为它会依赖别的git库或者缺少mk。所以可能编译不成功

repo sycn  URL. 这个URL就是manifest中指定的name.

如:repo sycn platform/packages/apps/Nfc (-j8) :platform/packages/apps/Nfc是project的name.

总结来说:在repo目录(即.repo)之外,根据repo配置(即.repo/manifest.xml文件),从.repo/projects/*中提取出指定分支

的各个git项目(即.repo/projects中git项目的子集)的工作目录,形成repo工作目录,可供开发使用。

执行完如上的命令后:

  1. 工作区:
  2. xp022430@cnbjlx24729:~/Projects/n-yoshino$ ls -a
  3. . Android.bp bootable build.sh dalvik device frameworks
  4. libcore ndk pdk .repo system vendor
  5. .. art bootstrap.bash buildspec.mk developers docs hardware
  6. libnativehelper out platform_testing sdk toolchain
  7. abi bionic build cts development external kernel
  8. Makefile packages prebuilts shortcut-fe tools

可以看到完整的一个Android源码工程,也是我们repo的工作区,再进入到.repo看看其它文件

  1. xp022430@cnbjlx24729:~/Projects/n-yoshino$ cd .repo/
  2. xp022430@cnbjlx24729:~/Projects/n-yoshino/.repo$ ls -a
  3. . .. manifests manifests.git manifest.xml project.list project-objects projects
  4. repo .repopickle_fetchtimes

下面我们先大概了解一下重要的几个目录的含义:

.repo:此为repo目录,可用于提取相应项目工作目录到外面的repo工作目录。

.repo/manifests.git:此为repo配置信息的git库,不同版本包含不同配置信息。每个repo项目初始化后也会有自己的git仓

库的repo也会建立一个Git仓库,用来记录当前Android版本下各个子项目的Git仓库分别处于哪一个分

支,这个仓库通常叫做:manifest仓库。

.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命令都会从服务器更新

最新的配置。这里通过-m指定的manifests中的xml文件中。

.repo/repo:此为repo脚本集的git库,用于repo管理所需的各种脚本,repo的所有子命令就是其中的对应脚本实现。这

些脚本也通过git管理,.repo/repo/.git为对其应的git目录,用git进行版本管理。

  1. xp022430@cnbjlx24729:~/Projects/n-yoshino/.repo/repo$ ls -a
  2. . command.py editor.py .git git_config.py git_refs.pyc ... wrapper.py
  3. .. command.pyc editor.pyc .gitattributes git_config.pyc git_ssh ... wrapper.pyc
  4. color.py COPYING error.py git_command.py .gitignore hooks ... trace.py
  5. color.pyc docs error.pyc git_command.pyc git_refs.py main.py ... trace.pyc

注意:三个点的表示省略号,此处省略了一部分的显示,可以看到都是repo的脚本还有.git版本库

.repo/projects:此为repo所管理的所有git项目集,包含repo当前配置所指定的所有git项目对应的git目录

projects目录如下:

  1. xp022430@cnbjlx24729:~/Projects/n-yoshino/.repo/projects$ ls
  2. abi bootable cts.git development.git external kernel ... tools
  3. art.git build dalvik.git device frameworks libcore.git ... vendor
  4. bionic.git build.git developers docs hardware libnativehelper.git ... toolchain
  5. xp022430@cnbjlx24729:~/Projects/n-yoshino/.repo/projects/packages/apps/Nfc.git$ ls
  6. branches config description FETCH_HEAD HEAD hooks info logs objects packed-refs refs svn
  7. xp022430@cnbjlx24729:~/Projects/n-yoshino/.repo/projects/packages/apps$ ls
  8. BasicSmsReceiver.git CellBroadcastReceiver.git Email.git ... Stk.git
  9. Bluetooth.git CertInstaller.git EmergencyInfo.git ... StorageManager.git
  10. Browser2.git CMFileManager.git ExactCalculator.git ... Tag.git
  11. Calculator.git ContactsCommon.git Gallery2.git ... Terminal.git
  12. Calendar.git Contacts.git Gallery.git ... Test
  13. Camera2.git DeskClock.git HTMLViewer.git ... TV.git
  14. Camera.git DevCamera.git KeyChain.git ... TvSettings.git
  15. CarrierConfig.git Dialer.git Launcher2.git ... UnifiedEmail.git

注意其实工作区中每个git工作目录中的.git只是指向.repo/projects/*的软连接,在repo工作目录中的某个git工作目录更新

相应的git库,其实最终会更新到.repo/projects中对应的git库。也就是此处才是真正存放版本库的地方。

最后:刚刚repo sync之后,当前工作目录不处于任何分支,其中的修改只能本地保存无法提交至远端,若想提交工作,需

要先创建一个分支保存工作内容。如下(注意和在那个目录下没关系的)

  1. xp022430@cnbjlx24729:~/Projects/n-mr1-yoshino2/packages/apps/Dialer$ git branch
  2. * (no branch)

4、repo的使用。

基本上所有的repo命令。

如果只是:  repo   命令参数     那么就代表对所有的git仓库的执行,无论是在那个目录下。想想也是repo的配置是在工作

目录的最外层配置的对上面来说就是~/Projects/n-mr1-yoshino2,这个目录下包含了所有的git仓库.

当你向操纵某个指定的git仓库的时候,无论是不是在它目录下。执行 repo  命令参数  指定的本地仓库路径(也就是path对应)

4.1、创建/切换分支。

刚下载下来的代码是没有本地分支的。

  1. xp022430@cnbjlx24729:~/Projects/n-mr1-yoshino2/packages/apps/Dialer$ git branch
  2. * (no branch)
  3. xp022430@cnbjlx24729:~/Projects/n-mr1-yoshino2/packages/apps/Bluetooth$ git branch
  4. * (no branch)

创建 :调用 repo start 分支名字  --all : 为全部的本地git仓库配置分支名字

然后在config里面会看到,自动关联了upstream根据manifet中的revision。

如:

  1. <project name="platform/packages/apps/Nfc" path="packages/apps/Nfc" revision="n-common-pn553"/>
  2. branch.stable.remote=origin
  3. branch.stable.merge=n-common-pn553

repo start 名字   platform/packages/apps/Nfc :为指定的git仓库配置

如:设置分支名字未table的时候

  1. repo start stable platform/packages/apps/Nfc
  2. xp022430@cnbjlx24729:~/Projects/n-yoshino/packages/apps/Nfc$ git branch
  3. * stable

切换:repo checkout branch_name [projects]

查看分支:repo branches [projects]

[projects] :代表可省略git仓库,此时会查看所有的git仓库

  1. cnbjlx24729:~/Projects/n-mr1-yoshino2/packages/apps/Bluetooth$ repo branches
  2. (no branches)
  3. cnbjlx24729:~/Projects/n-mr1-yoshino2/packages/apps/Bluetooth$ repo branches .
  4. (no branches)
  5. cnbjlx24729:~/Projects/n-mr1-yoshino2/packages/apps/Bluetooth$ repo branches platform/packages/apps/Nfc
  6. (no branches)

repo abandon <branchname> [projects]: 删除指定的分支. 是对git branch -D的封装.

4.2、比较差异

repo diff [projects]:查看工作区的差异

repo diff :查看所有

repo diff project1 project2 :查看指定的project1、project2。

4.3、repo stage [projects]

相当于git add 把工作区内容加入到缓存区。

4.5、repo status [projects]

同时显示缓存区和工作区的文件的状态.

4.6、repo push :一般用很少用

repo push <remote name> [--all | [projects]]

git(17)---repo的基本认识相关推荐

  1. Git和Repo扫盲——如何取得Android源代码

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion.CVS这样的集中式版本控制系统.在集中式版本控制系统 ...

  2. Git和Repo管理使用简要介绍

    在Linux平台下进行Android系统项目开发时,需要git或repo管理. 一. Git和Repo的区别: 1. Git:Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的 ...

  3. git(5)---Git 与Repo 管理Android代码

    Git 与Repo 管理代码 要处理 Android 代码,您需要同时使用 Git 和 Repo.在大多数情况下,您可以仅使用 Git(不必使用 Repo),或结合使用 Repo 和 Git 命令以组 ...

  4. git(4)---Git、Repo、Gerrit三者的区别

    Git.Repo.Gerrit三者的区别 Git作为一个分布式版本控制工具,可以创建分支,切换分支,方便协作,git pull/push: --但是对于类似于android如此庞大的项目,只用git库 ...

  5. 解决”error: info is different in .repo/manifests/.git vs .repo/manifests.git报错

    经常碰到这样的情况:".repo/manifests/"仓库有更新,我们在手动git pull到最新后,再执行sync或者init会报"error: info is di ...

  6. git与repo与scp

    git与repo与scp Ubuntu下git的安装与使用 安装 使用 git生成patch和打patch 生成patch 应用patch 打patch发生冲突 git分支 这些是各种场合常见的 Gi ...

  7. 构建git+gerrit+repo的Android代码服务器

    谷歌的Android源码是基于Git+Repo管理的,官方推荐的代码管理也是git+gerrit+repo.谷歌自己都在用的东西,各种优点,各种强大就不用说了,你懂的.关于它们的介绍可查阅极客学院的W ...

  8. Git与Repo入门

    版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工程等的修改历史,方便查看更改历史,备份以便恢复以前的版本,多人协作... 一.原始版本控制 最原始的版本控制是纯手工的版本控制:修改文 ...

  9. android git 版本管理,Android版本管理(git 和 repo)

    看了好久android論壇上的介紹,還是不明白,沒辦法,自己測試一下吧 首先下載好源碼.... 1.作Branch分支 $ repo start BRANCH_NAME PROJECT 比如,我要做自 ...

最新文章

  1. 初学 Ajax(涉及 php)
  2. 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)...
  3. leetcode 740. 删除并获得点数(dp)
  4. 为什么要做稀疏编码_为什么我每天都要编码一年,所以我也学到了什么,以及如何做。...
  5. Python学习 :面向对象 -- 成员修饰符
  6. matlab 三维 作图 坐标轴_MATLAB学习——MATLAB中的三维绘图指令
  7. jQuery源码研究分析学习笔记-jQuery.fn.init()(五)
  8. pythonrange函数用法_python range()函数详细用法
  9. python 投票计数器全班50人3个候选人_Python程序为STV投票系统,为每个人加上所有的第一偏好票...
  10. 的ppt_PPT制作小白,如和做好PPT
  11. LeetCode For SQL 184. 部门工资最高的员工 (分组 from嵌套)
  12. Android播放外部音乐文件
  13. 【基础篇】Navicat让MySQL数据库可视化
  14. 面试题:你印象最深刻的两个bug是什么,你是怎么解决的?
  15. 苹果开发的资源URL链接
  16. GIF制作软件哪个好,怎么制作搞笑GIF
  17. 新春蓝牙耳机怎么选?五年发烧友吐血盘点,高性能蓝牙耳机推荐
  18. 企业局域网即时通讯软件存在是必然趋势
  19. 20 个短小精悍的 pandas 骚操作
  20. 新华三笔试题(助力面试)

热门文章

  1. L2TP协议笔记2---L2TP主要协议报文分析
  2. linux路由内核实现分析(四)---路由缓存机制(2)
  3. 【STM32】HAL库 STM32CubeMX教程十---DAC
  4. 嵌入式Linux系统编程学习之十七计时器与信号
  5. Spring-第2天
  6. ES面试基础知识要点
  7. SqlServer显示“正在还原...”
  8. (后端)Java中关于金额大小写的工具类
  9. windows下使用DOS命令删除大文件
  10. 设计模式之—访问者模式VisitorPattern