介绍

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代码仓库。

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

工作原理

前面我们说过,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"

  • 指定代码仓库源地址:

    <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.

总结

好工具还是要用起来。

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

  1. repo同步代码_一次协作多端同步,打通看云、github互相同步(serverless实践)

    本文原创首发于 https://coding3min.com/1194.html 之前在看云上专门搞了个电子书来归档和协作一些文章,支持 webhook(钩子),但是一直没用上,今天端午放假,早上就突 ...

  2. repo同步代码_iTOP-4412开发板android4.0代码下载和编译

    Android4.0 源码可以从光盘,网盘获取稳定版本,也可以从 GitHub 下载我们的开发版 本.GitHub 仅提供源码下载,不提供二进制下载,二进制文件存放在光盘和网盘中. 基于迅为4412开 ...

  3. 挑战UnityShader学习之三_工欲善其事必先利其器Standard面板详细解析和代码自定义

    Standard Shader面板原来的样子 之前第一第二章,分别分享了,最普通,进阶Phonn光的PBR(都不是PBR)模板,本来第三章想分享Unity官方的PBR:结果碰到Unity的作死模式,又 ...

  4. iapp退出软件按钮代码_番茄·人生软件介绍 及 更新日志

    软件网址:www.tomatolist.com 软件介绍:有哪些好用的番茄工作法软件? 功能建议和Bug反馈,请反馈至知乎用户群 番茄人生软件用户圈 - 知乎​www.zhihu.com 0805版 ...

  5. github随时同步代码_原来用IntelliJ IDEA操作GitHub这么方便啊

    IntelliJ IDEA集成了对GitHub的支持,使上传代码到GitHub和从GitHub下载代码更加方便快捷. 一. 分享代码到GitHub 1.首先需要在IntelliJ配置Git,如果没有正 ...

  6. 网页版的svn怎样同步代码_学会使用Hdlbits网页版Verilog代码仿真验证平台

    大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过 "https://hdlbits.01xz.net/wiki/Main_Page&q ...

  7. 64位java安装包_工欲善其事必先利其器,java开发利器

    已经连续分享了三天了,今天继续分享,今天分享的主要内容是开发工具的使用和安装IntelliJ IDEA,以及方法的简介和使用(这篇文章篇幅有点长大家可以先把工具安装好熟悉一下,方法的内容放到下一篇文章 ...

  8. 黑马程序员_工欲善其事必先利其器

    曾经有一个段子说: mac上使用mac os的是文艺青年 mac上使用win的是二逼青年 pc上使用win的是普通青年 pc上使用mac os的牛逼青年 当我决定搞苹果开发的时候,首先遇到的就是开发环 ...

  9. repo sync同步代码出现contains uncommitted changes

    repo sync同步代码时候出现 Q:error: packages/apps/Wizard/: contains uncommitted changes 出现这个问题的原因是本地代码发生变化,但未 ...

最新文章

  1. php 依赖注入框架,通过实现依赖注入和路由,构建一个自己的现代化PHP框架
  2. 征集并发文献译者之Disruptor
  3. FATAL ERROR: Could not find ./bin/my_print_defaults
  4. java mkfifo_在Java中创建命名管道
  5. MySQL-分库分表初探
  6. 拉取数据_如何拉取公网RTSP/RTMP流在内网多客户端播放
  7. 6月21 百度文本编辑器
  8. 映射网络驱动器会自动断开的解决方法
  9. Dubbo基础知识总结
  10. 算法笔记_094:蓝桥杯练习 矩阵相乘(Java)
  11. python定义一个circle类、根据圆的半径_定义一个“圆”类Circle,该圆类的数据成员包括:圆心点位置及圆的半径...
  12. Mariadb----字符类型 (五)
  13. 94. Binary Tree Inorder Traversal
  14. 51.Linux/Unix 系统编程手册(下) -- POSIX IPC 介绍
  15. JAVA解压Zip格式文件的代码
  16. Unity NGUI 之 UIScrollView 基本用法
  17. 48 个无版权素材网站收好,以后不怕视觉中国的律师函
  18. 苹果和android无线充电,这款mophine无线充电器,苹果安卓放上去就能充
  19. 融云及时通讯 加入群聊
  20. Nacos服务注册流程(一)

热门文章

  1. ES迁mysql_使用kafka连接器迁移mysql数据到ElasticSearch
  2. 一个二线城市程序员的一年【坐标成都】
  3. java继承调用先后_「继承顺序」JAVA继承顺序 - seo实验室
  4. android物理健代码,Android 物理按键整理及实例代码
  5. error C2143: syntax error : missing ';' before '}'
  6. MySQL 修改视图
  7. Python安装与环境变量的配置
  8. Dev-C++ 常用快捷键大全
  9. 数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案
  10. oracle 从右往左截取_截取GIF、调分辨率、快捷拨号,三星这些功能让人爱不释手...