日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

介紹

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

解決的問題

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

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

我們可以自己寫一些腳本工具來管理這個版本管理文件,不過,既然已經(jīng)有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版本的,而且我已經(jīng)把里面的源從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目錄下的內(nèi)容,發(fā)現(xiàn)什么也沒有。不過,用ls -sl指令查看,還是發(fā)現(xiàn)有一個隱藏的文件夾,叫.repo/,這里暫時先記一下。

然后,我們運行:

repo sync -j4

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

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

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

我們又執(zhí)行指令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

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

.├── 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指令時參數(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>

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

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

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

    repo init -u -b

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

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

    repo sync -j4

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

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

    文件解析:defaults.xml

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

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

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

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

    • 明確代碼倉庫:

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

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

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

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

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

  • path:確定目標目錄,比如path="poky"即確定了把poky這個代碼倉庫克隆到當前目錄下的poky目錄。

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

    臨時修改

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

    不過,還是有點小伎倆,可以要工作稍微簡單一些。比如,我們可以直接修改代碼倉庫的代碼,進行測試。我們也可以修改.repo/manifests/defaults.xml文件里的內(nèi)容,然后運行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.

    總結(jié)

    好工具還是要用起來。

    總結(jié)

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

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