repo同步代码_工欲善其事,必先利其器:repo 介绍

介绍

repo非彼repo。这里的repo,是指谷歌公司的一款小工具,名字就叫repo(我承认,这不是一个好名字,Google里面怎么搜都搜不到它的真身)。

解决的问题

有时候,我们需要在一台电脑上克隆很多个代码仓库,编译它们,然后又要把他们作为一个完整的系统来运行。而每一个代码仓库,随时开发的进行,会有很多个不同的分支,或不同的版本(假设版本是以git tag为标记的)。于是,我们经常会犯一个小小的错误,那就是不同的代码仓库之间并不相互兼容,导致编译不能通过,或者运行的时候不能正常工作。对于前者,我们在编译的时候能发现问题;对于后者,可能就不是很方便找到问题原因了。

对于这样的一个问题,我们最简单的方法,是把各个代码仓库的版本信息记录在一个文件里面,然后需要的时候,就对比这个文件的版本信息,来确保系统的完整性。但是,问题又来了,对于这个文件,如果我们也经常修改呢?如何保证这个文件也是正确的呢?那只能把这个文件也管理起来,让它自己也有版本管理。

我们可以自己写一些脚本工具来管理这个版本管理文件,不过,既然已经有repo这么好的工具了,那我们还是使用它吧!

安装 repo

正常情况下,我们可以这样子安装这个工具:

curl https://storage.googleapis.com/git-repo-downloads/repo > repochmod a+x reposudo mv repo /bin/

我们把它放到/bin/目录下,这样使用起来更加方便一些。

在众所周知的情况下,额,还是访问我的 GitHub 来安装吧:

git clone https://github.com/one-third-robot/article-007-repo.gitcd article-007-repochmod a+x reposudo mv repo /bin/

用以上指令安装的repo是v2.8版本的,而且我已经把里面的源从google修改成 GitHub 的一个镜像了,于是这个工具就能正常使用了。

repo 初体验

讲解repo是如何工作之前,我们还是先体验一下吧:

mkdir fsl-yoctocd fsl-yoctorepo init -u https://github.com/one-third-robot/fsl-yocto.git -b dunfell

这时在终端上能看到:

Downloading Repo source from https://github.com/GerritCodeReview/git-reporemote: Finding sources: 100% (7/7)remote: Total 7 (delta 6), reused 7 (delta 6)Unpacking objects: 100% (7/7), 1.76 KiB | 200.00 KiB/s, done.Downloading manifest from https://github.com/one-third-robot/fsl-yocto.gitremote: Enumerating objects: 7, done.        remote: Counting objects: 100% (7/7), done.        remote: Compressing objects: 100% (6/6), done.        remote: Total 7 (delta 1), reused 7 (delta 1), pack-reused 0      Your identity is: [这里是乱码,将就一下,哈哈]If you want to change this, please re-run 'repo init' with --config-namerepo has been initialized in /home/kingsnake/fsl-yocto

这时候,如果我们使用ls指令查看fsl-yocto目录下的内容,发现什么也没有。不过,用ls -sl指令查看,还是发现有一个隐藏的文件夹,叫.repo/,这里暂时先记一下。

然后,我们运行:

repo sync -j4

这时,就能看到终端一直在滚动了,它正在同步代码仓库。等它完成,再查看一下fsl-yocto目录下的内容:

fsl-yocto $ tree -L 1.├── meta-freescale├── meta-openembedded└── poky

现在多出了很多文件夹了。然后我们随便进入一个目录,比如meta-freescale,然后执行git log指令:

commit 46f54fdc5ad854a22bf759aac7fd65db1d1bb574 (HEAD, yocto/dunfell, m/dunfell)Author: Andrey Zhizhikin Date:   Thu Nov 19 18:20:20 2020 +0000    linux-fslc-imx: update to v5.4.78        Kernel repository has been upgraded to v5.4.78 from stable korg.        Following upstream commits are included in this version:     ......(后面还有很多内容,就不展示了)......

我们又执行指令git remote -v,可以看到:

yoctohttps://git.yoctoproject.org/git/meta-freescale (fetch)yoctohttps://git.yoctoproject.org/git/meta-freescale (push)

所以,这确实是一个git代码仓库。

最后,我们来看一下动画演示:

1ab5dfa896c5af7655cd299b8787dc2f.gif

工作原理

前面我们说过,repo init指令运行完之后,会生成一个.repo/的文件夹,我们看一下里面有什么东西吧:

cd fsl-yocto/.repotree -L 1

我们看到以下内容:

.├── manifests├── manifests.git├── manifest.xml├── project.list├── project-objects├── projects└── repo

我们进入到mainfests目录下,看到有两个文件以及一个.git隐藏文件夹:

manifests $ ls -a.  ..  default.xml  .git  README.md

说明,这是一个git代码仓库!我们再来看一下这个代码仓库的源地址:

manifests $ git remote -voriginhttps://github.com/one-third-robot/fsl-yocto.git (fetch)originhttps://github.com/one-third-robot/fsl-yocto.git (push)

终于找到了,这就是前面运行repo init指令时参数-u后面的git地址。再来看一下defaults.xml文件的内容吧:

<?xml  version="1.0" encoding="UTF-8"?><manifest>  <default sync-j="4" revision="dunfell"/>  <remote fetch="https://git.yoctoproject.org/git" name="yocto"/>  <remote fetch="https://github.com/openembedded" name="oe"/>      <project remote="yocto" revision="dunfell" name="poky" path="poky"/>  <project remote="yocto" revision="dunfell" name="meta-freescale" path="meta-freescale"/>    <project remote="oe" revision="dunfell" name="meta-openembedded" path="meta-openembedded"/>  manifest>

对于这个xml文件,我们也基本上可以看出来,它“指导”了repo从两个地址克隆了三个代码仓库。

因此,我们可以总结:谷歌repo工具读取defaults.xml文件,按照该文件的内容,把多个代码仓库克隆到本地。它有两个具体的步骤。

  1. 第一步,初始化文件夹:

    repo init -u -b 

    该指令克隆这个代码仓库的分支到.repo/manifests目录。这要求这个代码仓库里必须有defaults.xml文件。

  2. 第二步,同步代码仓库:

    repo sync -j4

    该指令根据.repo/manifests/defaults.xml文件,把最终想要的代码仓库克隆到指令目录。

如何写这个defaults.xml文件呢?请看下一节的讲解。

文件解析:defaults.xml

前面讲了,谷歌repo工具主要使用defaults.xml文件。我们详细来讲解一下它的内容:

  • 所有的正文都放在中间:

    <?xml  version="1.0" encoding="UTF-8"?><manifest>      [这里是正文]manifest>
  • defaults.xml文件的版本信息:

    <default sync-j="4" revision="dunfell"/>

    这里的revision="dunfell"是大的版本号,它可以是任意的字符串,只要便于理解即可。比如,我们的fsl-yocto这个代码仓库(不是fsl-yocto那个包含了很多git代码仓库的文件夹哦),它的git tree如下:

    因此,在master主分支,这里是revision="master"

  • 82f98a6656787ca17c1ea9e78ae55a3a.png

  • 指定代码仓库源地址:

    <remote fetch="https://git.yoctoproject.org/git" name="yocto"/><remote fetch="https://github.com/openembedded" name="oe"/>

    这两行指定了代码仓库的源地址,并分别给了它们一个别名:yoctooe

  • 明确代码仓库:

    <project remote="yocto" revision="dunfell" name="poky" path="poky"/><project remote="yocto" revision="dunfell" name="meta-freescale" path="meta-freescale"/>

    这两行,有四个内容:

  1. remote:这里为yocto,即要从https://git.yoctoproject.org/git这里克隆某个代码仓库;

  2. revision:这里是版本,主要是分支名,应该也可以用git tag的版本,不过有兴趣的小伙伴可以测试一下吧。当然,要确保要克隆的代码仓库是有这个分支或tag标签的。

  3. name:代码仓库的名字。第一行为poky,因此,完整的git地址为:https://git.yoctoproject.org/git/poky, 有兴趣的小伙伴可以用git clone指令来单独克隆它。

  4. path:确定目标目录,比如path="poky"即确定了把poky这个代码仓库克隆到当前目录下的poky目录。

更高级一些的用法,有兴趣的小伙伴可以自行研究哦。

临时修改

实际工作当中,某个代码仓库是在不断开发的,它也是需要一直测试的。按照以上的步骤,我们总是要初始化一个文件夹,再同步,实际上还是挺麻烦的。

不过,还是有点小伎俩,可以要工作稍微简单一些。比如,我们可以直接修改代码仓库的代码,进行测试。我们也可以修改.repo/manifests/defaults.xml文件里的内容,然后运行repo sync -j4指令来同步它,再进行测试。对于第二个方法,我们可以测试一下:

我们把meta-freescale的版本修改为master,即:

<project remote="yocto" revision="master" name="meta-freescale" path="meta-freescale"/>

我们再运行repo sync -j4,终端上显示:

Fetching projects: 100% (3/3), done.meta-freescale/: discarding 111 commitsrepo sync has finished successfully.

我们再进入metta-freescale,运行git log,我们看到:

commit 5a1b2c22a90a22e8d9d178324451e1c58d01cee7 (HEAD, yocto/master, m/dunfell)Author: Andrey Zhizhikin Date:   Tue Nov 24 22:34:37 2020 +0000    linux-fslc-imx: update to v5.4.80        Kernel repository has been upgraded to v5.4.80 from stable korg.        Following conflicts were resolved during merge:    ----    - arch/arm64/boot/dts/freescale/imx8mn.dtsi:    Fix minor merge conflict where commit [8381af1b684c] in stable tree    removed one blank line.

总结

好工具还是要用起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ddd 企业应用架构模式_灵魂拷问:用了DDD分包就是落地了领域驱动设计吗?谈谈DDD本质...

学习DDD的时候&#xff0c;作为开发&#xff0c;我们更关心它在技术层面的东西&#xff0c;尤其体现在DDD的分包方式、编码技巧等方面。自然的&#xff0c;我们不禁发问&#xff0c;用了DDD的分包&#xff0c;就是实践落地了DDD了么&#xff1f;不卖关子&#xff0c;直接说答案…

java常见编码

摘自&#xff1a;http://www.cnblogs.com/yaya-yaya/p/5768616.html红色 主要点  灰色 内容 绿色 知识点 橘色 补充内容几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题&#xff0c;那就是为什么要编码&#xff1f;我们能不能不编码&#xff1f;要…

准确率 召回率_机器学习中F值(F-Measure)、准确率(Precision)、召回率(Recall)

在机器学习、数据挖掘、推荐系统完成建模之后&#xff0c;需要对模型的效果做评价。业内目前常常采用的评价指标有准确率(Precision)、召回率(Recall)、F值(F-Measure)等&#xff0c;下图是不同机器学习算法的评价指标。下文讲对其中某些指标做简要介绍。本文针对二元分类器&am…

Saving James Bond - Easy Version 原创 2017年11月23日 13:07:33

06-图2 Saving James Bond - Easy Version&#xff08;25 分&#xff09; This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by a group of drug dealers. He was sent to …

pandas 合并所有列_Python学习:Pandas库+练习资料

pandas包含数据结构和数据处理工具的设计使得在Python中进行数据清洗和分析非常快捷。pandas经常是和NumPy,Scipy以及数据可视化工具matplotlib一起使用的。pandas支持大部分NumPy语言风格的数组计算&#xff0c;但最大的不同在于pandas是用于处理表格型或异质型数据的。而NumP…

zabbix自动发现主机并加入组绑定模板

在被监控主机多的情况下&#xff0c;怎样将这些主机加入zabbix server进行监控呢&#xff1f;下面将介绍下zabbix自动发现功能 1、创建自动发现规则 创建“规则名称&#xff0c;配置ip范围及检查方式”&#xff0c;点击“增加”&#xff0c;完成自动发现规则的创建 2、加入组和…

kotlin 用协程做网络请求_中国电信营业厅: 感受 Kotlin 的 quot;加速度quot;

"我们手上是一个很成熟的项目&#xff0c;所以毫无疑问需要保留 Java 代码&#xff0c;目前只会在新开发的页面中使用 Kotlin&#xff0c;并已经感受到了它带来的便利。随着功能的迭代&#xff0c;我们相信更多的功能会转而使用 Kotlin。"—— 付迎鑫&#xff0c;电信…

拖动验证码插件

拖动验证码插件 效果图&#xff1a; 在验证前&#xff0c;提交弹出验证失败&#xff0c;验证后弹出验证成功。 文件结构&#xff1a; css&#xff1a; #drag{ position: relative;background-color: #e8e8e8;width: 300px;height: 34px;line-height: 34px;text-align: center; …

matlab padarray函数零,matlab padarray函数

1padarray功能&#xff1a;填充图像或填充数组。用法&#xff1a;B padarray(A,padsize,padval,direction)A为输入图像&#xff0c;B为填充后的图像&#xff0c;padsize给出了给出了填充的行数和列数&#xff0c;通常用[r c]来表示。padval表示填充方法。它的具体值和描述如下…

[知了堂学习笔记]_网络基础知识_1.OSI参考模型(网络七层协议)

OSI参考模型是国际标准化组织ISO制定的模型&#xff0c;把计算机与计算机之间的通信分成七个互相连接的协议层&#xff0c;如图&#xff1a; 1.1各层功能 1、物理层 最底层是物理层&#xff0c;这一次负责传送比特流&#xff0c;它从第二层数据接收数据帧&#xff0c;并将帧的结…

Linux版本配置环境变量,如何linux环境下配置环境变量过程图解

jdk下载地址&#xff1a;在linux环境下的root同级目录下配置software目录将下载好的jdk上传到software文件夹里面(我使用的操作软件是)到software这个目录下.输入命令:cd /software输入命令:ll就可以看到我们的jdk包解压文件解压命令 tar xzvf jdk-8u111-linux-x64.tar.gz解压之…

奔腾双核linux服务器,Dell推出双核心奔腾服务器

来自业内的消息&#xff0c;Dell近日推出了一台采用Intel双核心 Pentium D的服务器&#xff0c;这将给小型服务器带来更强的运算能力。Dell PowerEdge SC430 主要面向小型企业客户&#xff0c;价格在499美元起。相比PowerEdge SC420&#xff0c;Dell为 PowerEdge SC430 装配了两…

EasyPlayerPro Windows流媒体播放器(RTSP/RTMP/HTTP/HLS/File/TCP/RTP/UDP都能播)发布啦

EasyPlayerPro简介 EasyPlayerPro是一款全功能的流媒体播放器&#xff0c;支持RTSP、RTMP、HTTP、HLS、UDP、RTP、File等多种流媒体协议播放、支持本地文件播放&#xff0c;支持本地抓拍、本地录像、播放旋转、多屏播放等多种功能特性&#xff0c;核心基于ffmpeg&#xff0c;稳…

ALSA声卡笔记2---ASoC驱动框架

1、简单了解一下ASOC 在嵌入式系统里面的声卡驱动为ASOC&#xff08;ALSA System on Chip&#xff09; &#xff0c;它是在ALSA 驱动程序上封装的一层 分为3大部分&#xff0c;Machine&#xff0c;Platform和Codec ,三部分的关系如下图所示&#xff1a;其中Machine是指我们的…

python之路_自定义属性、json及其他js补充

一、自定义属性 我们知道&#xff0c;在前端页面渲染的过程中&#xff0c;我们可能会需要用到一些后端传来的参数&#xff0c;这种参数的获取我们一般是通过模板语言渲染得到。但是当这些参数是在js文件中被用到&#xff08;js代码若是单独以文件形式被引用&#xff0c;模板语言…

C语言打印日历总结报告,C语言打印日历

应同学的要求&#xff0c;写了个日历&#xff0c;输入年份&#xff0c;输出12个月份的日历表&#xff0c;代码如下 &#xff1a;#includebool isLeap(int year){if((year%40 && year%100!0) || (year%4000))return 1;elsereturn 0;}void printCalendar(int year){int d…

java中二进制怎么说_面试常用:说清楚Java中synchronized和volatile的区别

回顾一下两个关键字&#xff1a;synchronized和volatile1、Java语言为了解决并发编程中存在的原子性、可见性和有序性问题&#xff0c;提供了一系列和并发处理相关的关键字&#xff0c;比如synchronized、volatile、final、concurren包等。2、synchronized通过加锁的方式&#…

qt用c语言编程 pdf下载文件,Qt 使用Poppler实现pdf阅读器的示例代码

开发环境 Qt5.5.1、Qt Creator 3.5.1Qt实现pdf阅读器和MFC实现pdf阅读器&#xff0c;其实原理都是差不多的。注意&#xff1a;这个是MinGW版本的Qt&#xff0c;也就是运行在GCC环境下的库&#xff0c;里面只包含 *.dll 和 *.a 。如果是Vistual Studio版本的Qt &#xff0c;那么…

C语言工厂方法模式,工厂函数模式 (C语言实现)

工厂模式属于创建型模式&#xff0c;大致可以分为三类&#xff0c;简单工厂模式、工厂方法模式、抽象工厂模式。二. 工厂方法模式所谓工厂方法模式&#xff0c;是指定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子…

光绘文件 c语言 解析,AltiumDesigner输出光绘文件

1、钻孔信息生成设置打开PCB文件&#xff0c;放置钻孔位图符号对应的孔大小的列表&#xff1a;切换到DrillDrawing层放置字符串&#xff0c;Place->string(PS)&#xff0c;此时按Tab键&#xff0c;在出现的Text文本框中点击下拉箭头&#xff0c;选择.Legend&#xff0c;OK。…