Repo入門:邊玩邊學

前一篇文章Git入門:邊玩邊學我們介紹了Git,那接下來就介紹他的好基友RepoRepo 是以 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 (清單)

RepoManifest 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章