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代碼倉庫。
最后,我們來看一下動畫演示:
工作原理
前面我們說過,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文件,按照該文件的內容,把多個代碼倉庫克隆到本地。它有兩個具體的步驟。
第一步,初始化文件夾:
repo init -u -b該指令克隆這個代碼倉庫的分支到.repo/manifests目錄。這要求這個代碼倉庫里必須有defaults.xml文件。
第二步,同步代碼倉庫:
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"/>這兩行指定了代碼倉庫的源地址,并分別給了它們一個別名:yocto,oe。
明確代碼倉庫:
<project remote="yocto" revision="dunfell" name="poky" path="poky"/><project remote="yocto" revision="dunfell" name="meta-freescale" path="meta-freescale"/>這兩行,有四個內容:
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目錄。
更高級一些的用法,有興趣的小伙伴可以自行研究哦。
臨時修改
實際工作當中,某個代碼倉庫是在不斷開發的,它也是需要一直測試的。按照以上的步驟,我們總是要初始化一個文件夾,再同步,實際上還是挺麻煩的。
不過,還是有點小伎倆,可以要工作稍微簡單一些。比如,我們可以直接修改代碼倉庫的代碼,進行測試。我們也可以修改.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 介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 装饰器 继承_Python
- 下一篇: linq to sql 行转列_SQL