百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

多仓库管理工具——Repo 多个仓库如何管理

ztj100 2024-12-23 14:52 18 浏览 0 评论

Repo 是建立在Git上的一个多仓库管理工具,可以组织多个仓库的上传和下载。Repo是Google用Python脚本写的调用Git的脚本,主要帮助我们管理多个Git存储仓库,将其上传到我们的版本控制系统,并自动执行Android开发工作流程的某些部分。Repo并不是要取代Git,而是为了在Android环境下更加方便使用Git。下面来看看Repo的具体用法吧!

安装Repo

在安装Repo时,必须先要确保已经安装了Git工具,以及Python2.7+的环境,下面是在Mac下安装的流程:

1、确保主目录下有一个 bin/ 目录,并且该目录包含在路径中:

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

2、下载 Repo 工具,并确保它可执行:

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

Windows下没有curl工具可以下载,地址是 https://curl.se/windows/dl-7.74.0_2/curl-7.74.0_2-win64-mingw.zip 。不过也可以直接访问 https://storage.googleapis.com/git-repo-downloads/repo 网址,直接把内容复制到 ~/bin/repo 效果是一样的。另外如果googleapis.com无法访问的话也可以替换为Github的Repo地址:

curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo > ~/bin/repo

对于Linux安装过程可以参考 https://github.com/esrlabs/git-repo 这个仓库的README其实说得很清楚了。

Repo的背景

使用Repo之前,最好先熟悉Git,关于Git的推荐资料: https://git-scm.com/book/zh/v2 。其实Repo最开始是用来管理Android源代码库的,Android 源代码位于由 Google 托管的 Git 代码库中。Git 代码库中包含 Android 源代码的元数据,其中包括与对源代码进行的更改以及更改日期相关的元数据。而且Android版本库众多,版本库太大以及Git不能部分检出,如果所有的东西都放在一个库中,而某个开发团队比较关心可能只是某个小组件或者插件而已,但是却要下载如此庞大的版本库,所以这一切交给了Repo去管理。

那么Repo如何管理多个代码仓库的呢?

Repo的组成

Repo主要包括两部分:Repo引导脚本(Google 称之为Repo launcher)和Repo命令的主体部分。那么Repo仓库究竟有些什么东西呢,在我们初始化Repo仓库之后,会出现一个.repo的文件夹,里面有如下内容:

changlinzou@mac work % tree .repo -L 1
.repo
├── manifest.xml -> manifests/default.xml
├── manifests
├── manifests.git
├── project-objects
├── project.list
├── projects
└── repo

5 directories, 2 files

当执行 repo init 命令来初始化仓库的时候首先执行的就是Repo的引导脚本,该脚本会到我们指定的地方去下载Manifest 仓库,以及Repo命令主体部分。下载好之后就放在当前目录下面的 .repo 目录下,其中:


对于Manifests文件相信每一个Android开发中都不陌生,Android项目中Manifests声明了四大组件,就像列出的项目组件的清单一样。所以其实很容易类比,在这里manifests是清单文件的git仓库,这些xml文件中包含了各个git project的名称,检出的reversion,检出到哪个目录等等信息。Repo就是利用这些manifest文件去分别获取各个project,比如这样一个manifest文件:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
    <remote name="origin" fetch="https://github.com/" review="https://github.com/" />
    <default remote="origin" revision="master" sync-j="4" />
    <project name="xxx_projects/first.git" path="xxx" />
    <project name="yyy_projects/first.git" path="yyy" />
    <project name="zzz_lib/first.git" path="xxx/zzz_lib" />
    ......
</manifest>

下面是Repo的manifest文件中元素的意义:

Repo命令

下面的内容来自Google的官方文档: https://source.android.com/source/using-repo.html:

使用 Repo 需遵循的格式如下:

repo <COMMAND> <OPTIONS>

可选元素显示在方括号 [ ] 中。例如,许多命令会将项目列表用作参数。您可以为项目指定项目列表,作为名称列表或本地源代码目录的路径列表:

repo sync [<PROJECT0> <PROJECT1> <PROJECTN>]
repo sync [</PATH/TO/PROJECT0> ... </PATH/TO/PROJECTN>]

help

安装 Repo 后,您可以通过运行以下命令找到最新文档(开头是包含所有命令的摘要):

repo help

您可以通过在 Repo 树中运行以下命令来获取有关某个命令的信息:

repo help <COMMAND>

例如,以下命令会生成 Repo init 参数的说明和选项列表,该参数会在当前目录中初始化 Repo。(要了解详情,请参阅 init 。)

repo help init

init

$ repo init -u <URL> [<OPTIONS>]

在当前目录中安装 Repo。这会创建一个 .repo/ 目录,其中包含用于 Repo 源代码和标准 Android 清单文件的 Git 代码库。该 .repo/ 目录中还包含 manifest.xml ,这是一个指向 .repo/manifests/ 目录中所选清单的符号链接。

选项:

  • -u :指定要从中检索清单代码库的网址。您可以在 https://android.googlesource.com/platform/manifest 中找到常见清单
  • -m :在代码库中选择清单文件。如果未选择任何清单名称,则会默认选择 default.xml。
  • -b :指定修订版本,即特定的清单分支。

注意:对于其余的所有 Repo 命令,当前工作目录必须是 .repo/ 的父目录或相应父目录的子目录。

sync

repo sync [<PROJECT_LIST>]

下载新的更改并更新本地环境中的工作文件。如果您在未使用任何参数的情况下运行 repo sync ,则该操作会同步所有项目的文件。

运行 repo sync 后,将出现以下情况:

  • 如果目标项目从未同步过,则 repo sync 相当于 git clone 。远程代码库中的所有分支都会复制到本地项目目录中。
  • 如果目标项目已同步过,则 repo sync 相当于以下命令:git remote update git rebase origin/<BRANCH> 其中 *<BRANCH>* 是本地项目目录中当前已检出的分支。如果本地分支没有在跟踪远程代码库中的分支,则相应项目不会发生任何同步。
  • 如果 git rebase 操作导致合并冲突,那么您需要使用普通 Git 命令(例如 git rebase --continue )来解决冲突。

repo sync 运行成功后,指定项目中的代码会与远程代码库中的代码保持同步。

选项:

-d
-s
-f

upload

repo upload [<PROJECT_LIST>]

对于指定的项目,Repo 会将本地分支与最后一次 repo sync 时更新的远程分支进行比较。Repo 会提示您选择一个或多个尚未上传以供审核的分支。

您选择一个或多个分支后,所选分支上的所有提交都会通过 HTTPS 连接传输到 Gerrit。您需要配置一个 HTTPS 密码启用上传授权。要生成新的用户名/密码对以用于 HTTPS 传输,请访问 密码生成器 。

当 Gerrit 通过其服务器接收对象数据时,它会将每项提交转变成一项更改,以便审核者可以单独针对每项提交给出意见。要将几项“检查点”提交合并为一项提交,请使用 git rebase -i,然后再运行 repo upload。

如果您在未使用任何参数的情况下运行 repo upload,则该操作会搜索所有项目中的更改以进行上传。

要在更改上传之后对其进行修改,您应该使用 git rebase -igit commit --amend 等工具更新您的本地提交。修改完成之后,请执行以下操作:

  • 进行核对以确保更新后的分支是当前已检出的分支。
  • 对于相应系列中的每项提交,请在方括号内输入 Gerrit 更改 ID:# Replacing from branch foo [ 3021 ] 35f2596c Refactor part of GetUploadableBranches to lookup one specific... [ 2829 ] ec18b4ba Update proto client to support patch set replacments # Insert change numbers in the brackets to add a new patch set. # To create a new change record, leave the brackets empty.

上传完成后,这些更改将拥有一个额外的补丁程序集。

diff

repo diff [<PROJECT_LIST>]

使用 git diff 显示提交与工作树之间的明显更改。

download

repo download <TARGET> <CHANGE>

从审核系统中下载指定更改,并放在您项目的本地工作目录中供使用。

例如,要将 更改 23823 下载到您的平台/编译目录,请运行以下命令:

$ repo download platform/build 23823

repo sync 应该可以有效移除通过 repo download 检索到的任何提交。或者,您可以将远程分支检出,例如 git checkout m/master

注意:由于全球的所有服务器均存在复制延迟,因此某项更改(位于 Gerrit 中)出现在网络上的时间与所有用户可通过 repo download 找到此项更改的时间之间存在些许的镜像延迟。

forall

repo forall [<PROJECT_LIST>] -c <COMMAND>

在每个项目中运行指定的 shell 命令。通过 repo forall 可使用下列额外的环境变量:

REPO_PROJECT
REPO_PATH
REPO_REMOTE
REPO_LREV
REPO_RREV

选项:

  • -c :要运行的命令和参数。此命令会通过 /bin/sh 进行求值,它之后的任何参数都将作为 shell 位置参数传递。
  • -p :在指定命令输出结果之前显示项目标头。这通过以下方式实现:将管道绑定到命令的 stdin、stdout 和 sterr 流,然后通过管道将所有输出结果传输到一个页面调度会话中显示的连续流中。
  • -v :显示该命令向 stderr 写入的消息。

prune

repo prune [<PROJECT_LIST>]

删减(删除)已合并的主题。

start

repo start <BRANCH_NAME> [<PROJECT_LIST>]

从清单中指定的修订版本开始,创建一个新的分支进行开发。

*<BRANCH_NAME>* 参数应简要说明您尝试对项目进行的更改。如果您不知道,则不妨考虑使用默认名称。

*<PROJECT_LIST>* 指定了将参与此主题分支的项目。

注意:“.”是一个非常实用的简写形式,用来代表当前工作目录中的项目。

status

repo status [<PROJECT_LIST>]

对于每个指定的项目,将工作树与临时区域(索引)以及此分支 (HEAD) 上的最近一次提交进行比较。在这三种状态存在差异之处显示每个文件的摘要行

要仅查看当前分支的状态,请运行 repo status 。系统会按项目列出状态信息。对于项目中的每个文件,系统使用两个字母的代码来表示:

在第一列中,大写字母表示临时区域与上次提交状态之间的不同之处。

在第二列中,小写字母表示工作目录与索引之间的不同之处。


看完三件事??

?如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  1. 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  2. 关注头条号 『 JAVA后端架构 』,不定期分享原创知识。
  3. 同时可以期待后续文章ing
  4. 关注作者后台私信【888】有惊喜相送

相关推荐

人生苦短,我要在VSCode里面用Python

轻沉发自浅度寺量子位出品|公众号QbitAI在程序员圈子里,VisualStudioCode(以下简称VSCode)可以说是目前最火的代码编辑器之一了。它是微软出品的一款可扩展的轻量...

亲测可用:Pycharm2019.3专业版永久激活教程

概述随着2020年的到来,又有一批Pycharm的激活码到期了,各位同仁估计也是在到处搜索激活方案,在这里,笔者为大家收录了一个永久激活的方案,亲测可用,欢迎下载尝试:免责声明本项目只做个人学习研究之...

Python新手入门很简单(python教程入门)

我之前学习python走过很多的歧途,自学永远都是瞎猫碰死耗子一样,毫无头绪。后来心里一直都有一个做头条知识分享的梦,希望自己能够帮助曾经类似自己的人,于是我来了,每天更新5篇Python文章,喜欢的...

Pycharm的设置和基本使用(pycharm运行设置)

这篇文章,主要是针对刚开始学习python语言,不怎么会使用pycharm的童鞋们;我来带领大家详细了解下pycharm页面及常用的一些功能,让大家能通过此篇文章能快速的开始编写python代码。一...

依旧是25年最拔尖的PyTorch实用教程!堪比付费级内容!

我真的想知道作者到底咋把PyTorch教程整得这么牛的啊?明明在内容上已经足以成为付费教材了,但作者偏要免费开源给大家学习!...

手把手教你 在Pytorch框架上部署和测试关键点人脸检测项目DBFace

这期教向大家介绍仅仅1.3M的轻量级高精度的关键点人脸检测模型DBFace,并手把手教你如何在自己的电脑端进行部署和测试运行,运行时bug解决。01.前言前段时间DBFace人脸检测库横空出世,...

进入Python的世界02外篇-Pycharm配置Pyqt6

为什么这样配置,要开发带UI的python也只能这样了,安装过程如下:一安装工具打开终端:pipinstallPyQt6PyQt6-tools二打开设置并汉化点击plugin,安装汉化插件,...

vs code如何配置使用Anaconda(vscode调用anaconda库)

上一篇文章中(Anaconda使用完全指南),我们能介绍了Anaconda的安装和使用,以及如何在pycharm中配置Anaconda。本篇,将继续介绍在vscode中配置conda...

pycharm中conda解释器无法配置(pycharm配置anaconda解释器)

之前用的好好的pycharm正常配置解释器突然不能用了?可以显示有这个环境然后确认后可以conda正在配置解释器,但是进度条结束后还是不成功!!试过了pycharm重启,pycharm重装,anaco...

Volta:跨平台开发者的福音,统一前端js工具链从未如此简单!

我们都知道现在已经进入了Rust时代,不仅很多终端常用的工具都被rust重写了,而且现在很多前端工具也开始被Rust接手了,这不,现在就出现了一款JS工具管理工具,有了它,你可以管理多版本的js工具,...

开发者的福音,ElectronEgg: 新一代桌面应用开发框架

今天给大家介绍一个开源项目electron-egg。如果你是一个JS的前端开发人员,以前面对这项任务桌面应用开发在时,可能会感到无从下手,甚至觉得这是一项困难的挑战。ElectronEgg的出现,它能...

超强经得起考验的低代码开发平台Frappe

#挑战30天在头条写日记#开始进行管理软件的开发来讲,如果从头做起不是不可以,但选择一款免费的且经得起时间考验的低代码开发平台是非常有必要的,将大幅提升代码的质量、加快开发的效率、以及提高程序的扩展性...

一文带你搞懂Vue3 底层源码(vue3核心源码解析)

作者:妹红大大转发链接:https://mp.weixin.qq.com/s/D_PRIMAD6i225Pn-a_lzPA前言vue3出来有一段时间了。今天正式开始记录一下梗vue3.0.0-be...

Windows 11 + WSL2 打造轻量级 Linux 本地开发环境实战教程

一、前言...

基于小程序 DSL(微信、支付宝)的,可扩展的多端研发框架

Mor(发音为/mr/,类似more),是饿了么开发的一款基于小程序DSL的,可扩展的多端研发框架,使用小程序原生DSL构建,使用者只需书写一套(微信或支付宝)小程序,就可以通过Mor...

取消回复欢迎 发表评论: