前一篇文章Git入門:邊玩邊學我們介紹了Git
,那接下來就介紹他的好基友Repo
,Repo
是以 Git
爲基礎構建的代碼庫管理工具。Repo
可以在必要時整合多個 Git
代碼庫,將相關內容上傳到版本控制系統。藉助單個 Repo
命令,可以將文件從多個代碼庫下載到本地工作目錄。
Repo
命令是一段可執行的 Python
腳本,你可以將其放在路徑中的任何位置。
下載Repo
確保主目錄下有一個 bin/
目錄,並且該目錄包含在路徑中:
mkdir ~/bin
PATH=~/bin:$PATH
下載 Repo
工具,並確保它可執行:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
Repo
命令
使用 Repo
需遵循的格式如下:
repo <COMMAND> <OPTIONS>
可選元素顯示在方括號 [ ] 中。例如,許多命令會將項目列表用作參數。你可以爲項目指定項目列表,作爲名稱列表或本地源代碼目錄的路徑列表:
repo sync [<PROJECT0> <PROJECT1> <PROJECTN>]
repo sync [</PATH/TO/PROJECT0> ... </PATH/TO/PROJECTN>]
help
安裝 Repo
後,你可以通過在 Repo
樹中運行以下命令來獲取有關某個命令的信息:
repo help <COMMAND>
例如,以下命令會生成 Repo init
參數的說明和選項列表,該參數會在當前目錄中初始化 Repo
。
repo help init
init
repo init -u <URL> [<OPTIONS>]
在當前目錄中安裝 Repo
。這會創建一個 .repo/
目錄,其中包含用於 Repo
源代碼和源代碼清單文件的 Git
代碼庫。該 .repo/
目錄中還包含 manifest.xml
,這是一個指向 .repo/manifests/
目錄中所選清單的符號鏈接。
選項:
-u:指定要從中檢索清單代碼庫的網址。您可以在 https://android.googlesource.com/platform/manifest 中找到常見清單
-m:在代碼庫中選擇清單文件。如果未選擇任何清單名稱,則會默認選擇 default.xml。
-b:指定修訂版本,即特定的清單分支。
sync
repo sync [<PROJECT_LIST>]
下載新的更改並更新本地環境中的工作文件。如果你在未使用任何參數的情況下運行 repo sync
,則該操作會同步所有項目的文件。
upload
repo upload [<PROJECT_LIST>]
對於指定的項目,Repo
會將本地分支與最後一次 repo sync
時更新的遠程分支進行比較。Repo
會提示你選擇一個或多個尚未上傳以供審覈的分支。
forall
repo forall [<PROJECT_LIST>] -c <COMMAND>
在每個項目中運行指定的 shell
命令。
prune
repo prune [<PROJECT_LIST>]
刪除已合併的項目。
start
repo start <BRANCH_NAME> [<PROJECT_LIST>]
從清單中指定的修訂版本開始,創建一個新的分支進行開發。比較常用的是對所有的項目都創建開發分支:
repo start iot --all
status
repo status [<PROJECT_LIST>]
對於每個指定的項目,將工作樹與臨時區域(索引)以及此分支 (HEAD
) 上的最近一次提交進行比較。在這三種狀態存在差異之處顯示每個文件的摘要行。
Manifest
(清單)
Repo
用Manifest XML
來管理多個git
項目,以下是項目清單XML
文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="." name="seL4"/>
<remote fetch="../sel4proj" name="sel4proj"/>
<default remote="seL4" revision="master"/>
<project name="musllibc.git" path="projects/musllibc" revision="f58dacf44a679a2d7c10fbb8d8bc8f58e2123791" upstream="sel4"/>
<project name="riscv-pk" path="projects/riscv-pk" remote="sel4proj" revision="db937e995b09d343fb7146c447b0780ab1dca66b" upstream="fix-32bit"/>
<project name="seL4.git" path="kernel" revision="757c3ac98246afd0593367f1fa19054316a77495" upstream="master"/>
<project name="seL4_libs.git" path="projects/seL4_libs" revision="1697cb16ecbc7820cbda78d7c7c1896e884195a1" upstream="master"/>
<project name="seL4_tools.git" path="projects/tools" revision="930b6467eae8404e4a72555b693120ac0d64fc48" upstream="master">
<linkfile dest="CMakeLists.txt" src="cmake-tool/default-CMakeLists.txt"/>
<linkfile dest="init-build.sh" src="cmake-tool/init-build.sh"/>
</project>
<project name="sel4test.git" path="projects/sel4test" revision="dbd96aa862b8519165aaa8ae7bd5a1787048e34a" upstream="master"/>
<project name="util_libs.git" path="projects/util_libs" revision="c575f7280ce6184dbb2876f83a6c591c91de219e" upstream="master"/>
</manifest>
下面是清單元素的簡要概述:
<remote name="seL4" fetch="." />
這裏remote
元素指定了遠程git倉庫。
<project name="musllibc.git" remote="seL4" path="projects/musllibc" revision="sel4"/>
該project
元素聲明下面的屬性:
name: 遠程git服務器的名字
path: 是相對於項目初始化所在目錄的存儲庫檢出位置。
revision:指定要使用的存儲庫版本。支持分支和修訂哈希。支持標籤,但屬性值的結構必須爲refs/tags/tagname。
<default revision="master" remote="seL4"/>
設定所有projects
的默認屬性值,如果在project
元素裏沒有指定一個屬性,則使用default
元素的屬性值。
常見問題
如何檢出項目的發行版本?
repo init -u https://github.com/seL4/sel4test-manifest.git -b refs/tags/10.1.1
repo sync
如何更改已簽出項目的清單?
repo init -m master.xml
repo sync
這將在清單存儲庫中把當前清單更改master.xml
如何創建固定清單?
repo manifest -r -o pinned.xml
如何更快步項目
repo init -u https://github.com/seL4/sel4test-manifest.git --no-clone-bundle --depth=1
repo sync --jobs=8 --current-branch --no-clone-bundle