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,一经查实,立即删除!

相关文章

洛谷 P1754 球迷购票问题

P1754 球迷购票问题 题目背景 盛况空前的足球赛即将举行。球赛门票售票处排起了球迷购票长龙。 按售票处规定&#xff0c;每位购票者限购一张门票&#xff0c;且每张票售价为50元。在排成长龙的球迷中有N个人手持面值50元的钱币&#xff0c;另有N个人手持面值100元的钱币。假设…

php date函数实现,PHP date() 函数可实现的功能列表

date() 函数格式化本地日期和时间&#xff0c;并返回已格式化的日期字符串。date(format,timestamp);format 参数为必填&#xff0c;格式为何种格式timestamp 可选参数。规定整数的 Unix 时间戳。默认是当前的本地时间(time())。format参数如下&#xff1a;d - 一个月中的第几天…

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…

php 前置操作方法,前置操作-THINKPHP 5.0 手册最新版

前置操作可以为某个或者某些操作指定前置执行的操作方法&#xff0c;设置 beforeActionList属性可以指定某个方法为其他方法的前置操作&#xff0c;数组键名为需要调用的前置方法名&#xff0c;无值的话为当前控制器下所有方法的前置方法。[except > 方法名,方法名]表示这些…

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 …

commit是直接提交到远程吗 svn_xcode 把项目代码提交到远程SVN服务器

环境 xcode 7 Mac airxcode默认支持GIT源码管理工具&#xff0c;但现在想把代码提交到已有到SVN服务器上&#xff0c;步骤如下&#xff1a;1&#xff0c;在safari中打开svn链接地址&#xff0c;信任证书&#xff0c;输入用户名密码 &#xff0c;登陆成功&#xff0c;可以在浏览…

oracle导入 表 卡住了,oracle数据库怎么导入dmp,只导入数据不导入表结构?

使用方法&#xff1a;Exp parameter_namevalue or Exp parameter_name(value1,value2……)只要输入参数helpy就可以看到所有帮助.EXP常用选项1.FULL&#xff0c;这个用于导出整个数据库&#xff0c;在ROWSN一起使用时&#xff0c;可以导出整个数据库的结构。例如&#xff1a;ex…

【bzoj3991】[SDOI2015]寻宝游戏 树链的并+STL-set

题目描述 给出一棵树&#xff0c;初始每个点都是非必经的。多次改变某个点的必经状态&#xff0c;并询问从任意一个点出发&#xff0c;经过所有必经的点并回到该点的最小路程。 输入 第一行&#xff0c;两个整数N、M&#xff0c;其中M为宝物的变动次数。 接下来的N-1行&#xf…

vue 引入json地图_VUE中通过Echarts引入地图

渲染的方法如下 记得引入echartsimport echarts from echarts-----------------------------------init(dalian){this.$nextTick(()>{var myChart this.$echarts.init(document.getElementById(echartMap));echarts.registerMap(dalian, dalian,{});myChart.setOption({ser…

Django---admin

Django内置admin 1.配置路由 urlpatterns [url(r^admin/, admin.site.urls),] 2.定制admin 在admin.py中只需要讲Mode中的某个类注册&#xff0c;即可在Admin中实现增删改查的功能&#xff0c;如&#xff1a; admin.site.register(models.UserInfo) 但是&#xff0c;这种方式比…

vue 父组件获取接口值传到子组件_vue父组件异步获取数据传给子组件的方法

但是现在问题是父组件的数据是异步获取的&#xff0c;而子组件一开始就会渲染&#xff0c;如果此时没有传入数据&#xff0c;而子组件又要用到数据中的length属性时就会报错&#xff1a;怎么办呢&#xff1f;最简单的办法就是让子组件条件渲染&#xff0c;当有数据的时候才渲染…

python爬取数据需要注意的问题

1 爬取https的网站或是接口的时候&#xff0c;如果是不受信用的SSL证书&#xff0c;会报错&#xff0c;需要添加如下代码&#xff0c;如下代码可以保证当前代码块内所有的请求都自动屏蔽ssl证书问题&#xff1a; import ssl # 这个是爬取https的链接需要的&#xff0c;以及下…

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

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

oracle 取mac地址,java执行命令,得到Mac地址

public static void main(String[] args) {String os System.getProperty("os.name");System.out.println("操作系统:"os);String address "";if (os ! null && os.startsWith("Windows")) {try {String command "cmd…

solidity 十六进制字符串转十六进制bytes

pragma solidity ^0.4.16;contract Metadata {// 十六进制字符串转换成bytesfunction hexStr2bytes(string data)returns (bytes){uint _ascii_0 48;uint _ascii_A 65;uint _ascii_a 97;bytes memory a bytes(data);uint[] memory b new uint[](a.length);for (uint i 0;…

spring配置主库从库_Spring主从数据库的配置和动态数据源切换原理

原文&#xff1a;https://www.liaoxuefeng.com/article/00151054582348974482c20f7d8431ead5bc32b30354705000在大型应用程序中&#xff0c;配置主从数据库并使用读写分离是常见的设计模式。在Spring应用程序中&#xff0c;要实现读写分离&#xff0c;最好不要对现有代码进行改…

oracle rac实例切换,RAC+单实例DG的切换

RAC单实例DG的切换RAC单实例DG的搭建过程之前切换不成功&#xff0c;和参数设置有关。注意的参数是sid* 之类的&#xff0c;刚搭建好的环境racdbdg是单实例的&#xff0c;是备库&#xff0c;rac节点是主库。搭建完毕&#xff0c;切换了一次&#xff0c;刚好主库是单实例的racdb…

tablueau地图标记圆形_R语言在线地图神器:Leaflet for R包(三) 符号标记

如果还是直接写&#xff0c;会出现错误提示&#xff0c;说找不到经纬度的列像这种情况&#xff0c;就需要进行显式申明了&#xff1a;(顺便换个背景底图)leaflet(dh)%>%addProviderTiles("Esri.WorldStreetMap")%>%setView(116.4,39.9,zoom10)%>%addMarkers…