日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時(shí)間:2025/3/15 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 repo同步代码_工欲善其事,必先利其器:repo 介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

此repo非彼repo。這里的repo,是指谷歌公司的一款小工具,名字就叫repo(我承認(rèn),這不是一個(gè)好名字,Google里面怎么搜都搜不到它的真身)。

解決的問題

有時(shí)候,我們需要在一臺(tái)電腦上克隆很多個(gè)代碼倉庫,編譯它們,然后又要把他們作為一個(gè)完整的系統(tǒng)來運(yùn)行。而每一個(gè)代碼倉庫,隨時(shí)開發(fā)的進(jìn)行,會(huì)有很多個(gè)不同的分支,或不同的版本(假設(shè)版本是以git tag為標(biāo)記的)。于是,我們經(jīng)常會(huì)犯一個(gè)小小的錯(cuò)誤,那就是不同的代碼倉庫之間并不相互兼容,導(dǎo)致編譯不能通過,或者運(yùn)行的時(shí)候不能正常工作。對(duì)于前者,我們?cè)诰幾g的時(shí)候能發(fā)現(xiàn)問題;對(duì)于后者,可能就不是很方便找到問題原因了。

對(duì)于這樣的一個(gè)問題,我們最簡(jiǎn)單的方法,是把各個(gè)代碼倉庫的版本信息記錄在一個(gè)文件里面,然后需要的時(shí)候,就對(duì)比這個(gè)文件的版本信息,來確保系統(tǒng)的完整性。但是,問題又來了,對(duì)于這個(gè)文件,如果我們也經(jīng)常修改呢?如何保證這個(gè)文件也是正確的呢?那只能把這個(gè)文件也管理起來,讓它自己也有版本管理。

我們可以自己寫一些腳本工具來管理這個(gè)版本管理文件,不過,既然已經(jīng)有repo這么好的工具了,那我們還是使用它吧!

安裝 repo

正常情況下,我們可以這樣子安裝這個(gè)工具:

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版本的,而且我已經(jīng)把里面的源從google修改成 GitHub 的一個(gè)鏡像了,于是這個(gè)工具就能正常使用了。

repo 初體驗(yàn)

講解repo是如何工作之前,我們還是先體驗(yàn)一下吧:

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

這時(shí)在終端上能看到:

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

這時(shí)候,如果我們使用ls指令查看fsl-yocto目錄下的內(nèi)容,發(fā)現(xiàn)什么也沒有。不過,用ls -sl指令查看,還是發(fā)現(xiàn)有一個(gè)隱藏的文件夾,叫.repo/,這里暫時(shí)先記一下。

然后,我們運(yùn)行:

repo sync -j4

這時(shí),就能看到終端一直在滾動(dòng)了,它正在同步代碼倉庫。等它完成,再查看一下fsl-yocto目錄下的內(nèi)容:

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

現(xiàn)在多出了很多文件夾了。然后我們隨便進(jìn)入一個(gè)目錄,比如meta-freescale,然后執(zhí)行g(shù)it 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: ? ? ......(后面還有很多內(nèi)容,就不展示了)......

我們又執(zhí)行指令git remote -v,可以看到:

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

所以,這確實(shí)是一個(gè)git代碼倉庫。

最后,我們來看一下動(dòng)畫演示:

工作原理

前面我們說過,repo init指令運(yùn)行完之后,會(huì)生成一個(gè).repo/的文件夾,我們看一下里面有什么東西吧:

cd fsl-yocto/.repotree -L 1

我們看到以下內(nèi)容:

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

我們進(jìn)入到mainfests目錄下,看到有兩個(gè)文件以及一個(gè).git隱藏文件夾:

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

說明,這是一個(gè)git代碼倉庫!我們?cè)賮砜匆幌逻@個(gè)代碼倉庫的源地址:

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

終于找到了,這就是前面運(yùn)行repo init指令時(shí)參數(shù)-u后面的git地址。再來看一下defaults.xml文件的內(nèi)容吧:

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

對(duì)于這個(gè)xml文件,我們也基本上可以看出來,它“指導(dǎo)”了repo從兩個(gè)地址克隆了三個(gè)代碼倉庫。

因此,我們可以總結(jié):谷歌repo工具讀取defaults.xml文件,按照該文件的內(nèi)容,把多個(gè)代碼倉庫克隆到本地。它有兩個(gè)具體的步驟。

  • 第一步,初始化文件夾:

    repo init -u -b

    該指令克隆這個(gè)代碼倉庫的分支到.repo/manifests目錄。這要求這個(gè)代碼倉庫里必須有defaults.xml文件。

  • 第二步,同步代碼倉庫:

    repo sync -j4

    該指令根據(jù).repo/manifests/defaults.xml文件,把最終想要的代碼倉庫克隆到指令目錄。

  • 如何寫這個(gè)defaults.xml文件呢?請(qǐng)看下一節(jié)的講解。

    文件解析:defaults.xml

    前面講了,谷歌repo工具主要使用defaults.xml文件。我們?cè)敿?xì)來講解一下它的內(nèi)容:

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

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

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

      這里的revision="dunfell"是大的版本號(hào),它可以是任意的字符串,只要便于理解即可。比如,我們的fsl-yocto這個(gè)代碼倉庫(不是fsl-yocto那個(gè)包含了很多git代碼倉庫的文件夾哦),它的git tree如下:

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

    • 指定代碼倉庫源地址:

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

      這兩行指定了代碼倉庫的源地址,并分別給了它們一個(gè)別名:yocto,oe。

    • 明確代碼倉庫:

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

      這兩行,有四個(gè)內(nèi)容:

  • remote:這里為yocto,即要從https://git.yoctoproject.org/git這里克隆某個(gè)代碼倉庫;

  • revision:這里是版本,主要是分支名,應(yīng)該也可以用git tag的版本,不過有興趣的小伙伴可以測(cè)試一下吧。當(dāng)然,要確保要克隆的代碼倉庫是有這個(gè)分支或tag標(biāo)簽的。

  • name:代碼倉庫的名字。第一行為poky,因此,完整的git地址為:https://git.yoctoproject.org/git/poky, 有興趣的小伙伴可以用git clone指令來單獨(dú)克隆它。

  • path:確定目標(biāo)目錄,比如path="poky"即確定了把poky這個(gè)代碼倉庫克隆到當(dāng)前目錄下的poky目錄。

  • 更高級(jí)一些的用法,有興趣的小伙伴可以自行研究哦。

    臨時(shí)修改

    實(shí)際工作當(dāng)中,某個(gè)代碼倉庫是在不斷開發(fā)的,它也是需要一直測(cè)試的。按照以上的步驟,我們總是要初始化一個(gè)文件夾,再同步,實(shí)際上還是挺麻煩的。

    不過,還是有點(diǎn)小伎倆,可以要工作稍微簡(jiǎn)單一些。比如,我們可以直接修改代碼倉庫的代碼,進(jìn)行測(cè)試。我們也可以修改.repo/manifests/defaults.xml文件里的內(nèi)容,然后運(yùn)行repo sync -j4指令來同步它,再進(jìn)行測(cè)試。對(duì)于第二個(gè)方法,我們可以測(cè)試一下:

    我們把meta-freescale的版本修改為master,即:

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

    我們?cè)龠\(yùn)行repo sync -j4,終端上顯示:

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

    我們?cè)龠M(jìn)入metta-freescale,運(yùn)行g(shù)it 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.

    總結(jié)

    好工具還是要用起來。

    總結(jié)

    以上是生活随笔為你收集整理的repo同步代码_工欲善其事,必先利其器:repo 介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。