Repo 可簡化多個存放區的工作,是 Git 的輔助工具。如要瞭解 Repo 和 Git 之間的關係,請參閱「原始碼控管工具」。如要進一步瞭解 Repo,請參閱 Repo README。
存放區使用情形的格式如下:
repo command options
方括號 [] 內為選用元素。舉例來說,許多指令會將 project-list 做為引數。您可以將 project-list 指定為名稱清單,或專案本機來源目錄的路徑清單:
repo sync [project0 project1 ... projectn]repo sync [/path/to/project0 ... /path/to/projectn]
help
repo help
提供 repo 指令的說明。如要查看特定 Repo 指令的詳細資訊,請將指令指定為選項:
repo help command
舉例來說,下列指令會產生 init 指令的說明和選項清單:
repo help init
或者,如要只查看指令的可用選項清單,請執行:
repo command --help
例如:
repo init --help
init
repo init -u url [options]
在目前目錄中安裝 Repo。這個指令會建立目錄,其中包含 Repo 原始碼和標準 Android 資訊清單檔案的 Git 存放區。.repo/
選項:
-u:指定要從中擷取資訊清單存放區的網址。常見資訊清單位於https://android.googlesource.com/platform/manifest。-m:選取存放區中的資訊清單檔案。如未選取任何資訊清單名稱,預設會使用「default.xml」。-b:指定修訂版本,也就是特定 manifest-branch。
對於所有其餘的 Repo 指令,目前的工作目錄必須是 .repo/ 的上層目錄,或是上層目錄的子目錄。
同步處理
repo sync [project-list]
下載新變更,並更新本機環境中的工作檔案,基本上就是完成所有 Git 存放區的 git fetch。如果執行 repo sync 時未提供引數,系統會同步處理所有專案的檔案。
執行 repo sync 時,會發生下列情況:
如果專案從未同步處理,則
repo sync等同於git clone,遠端存放區中的所有分支都會複製到本機專案目錄。如果專案先前已同步處理,則
repo sync等同於:git remote updategit rebase origin/branch其中 branch 是本機專案目錄中目前已簽出的分支版本。如果本機分支版本未追蹤遠端存放區中的分支版本,專案就不會進行同步處理。
成功執行 repo sync 後,指定專案中的程式碼就會是最新版本,並與遠端存放區中的程式碼同步。
主要選項:
-c:僅從伺服器擷取目前的資訊清單分支。-d:將指定專案切換回資訊清單修訂版本。如果專案位於主題分支,但暫時需要資訊清單修訂版本,這個選項就相當實用。-f:即使專案同步失敗,仍繼續同步其他專案。-j threadcount:將同步作業分散到各個執行緒,加快完成速度。請確保機器不會過載,保留部分 CPU 供其他工作使用。如要查看可用的 CPU 數量,請先執行nproc --all。-q:以無聲模式執行,並隱藏狀態訊息。-s:同步處理至目前資訊清單中manifest-server元素指定的已知良好建構版本。
如需更多選項,請執行 repo help sync。
upload
repo upload [project-list]
將變更上傳至審查伺服器。針對指定專案,Repo 會比較本機分支與上次 Repo 同步處理期間更新的遠端分支。Repo 會提示您選取一或多個尚未上傳以供審查的分支。
選取分支機構的所有提交內容隨後會透過 HTTPS 連線傳輸至 Gerrit。您必須設定 HTTPS 密碼,才能啟用上傳授權。如要產生新的使用者名稱和密碼,以便透過 HTTPS 使用,請前往密碼產生器。
Gerrit 透過伺服器收到物件資料時,會將每個提交內容轉換為變更,以便審查人員針對特定提交內容加上註解。如要將多個檢查點提交合併為單一提交,請在執行上傳作業前使用 git rebase -i。
如果您執行 repo upload 時未提供引數,系統會搜尋所有專案,找出要上傳的變更。
如要編輯上傳後的變更,請使用 git rebase -i 或 git commit --amend 更新本機提交。完成編輯後:
- 確認更新的分支是目前已簽出的分支。
- 使用
repo upload --replace PROJECT開啟變更比對編輯器。 針對序列中的每個提交,在方括號內輸入 Gerrit 變更 ID:
# Replacing from branch foo [ 3021 ] 35f2596c Refactor part of GetUploadableBranches to look up one specific... [ 2829 ] ec18b4ba Update proto client to support patch set replacements # Insert change numbers in the brackets to add a new patch set. # To create a new change record, leave the brackets empty.
上傳完成後,變更會多出一組修補程式。
如要只上傳目前已簽出的 Git 分支版本,請使用 --current-branch (或 --cbr) 標記。
如要進行相關變更,請將所有 CL 保留在同一主題中。使用 --topic=TOPIC 上傳時新增主題名稱,或傳遞 -t 將主題名稱設為本機分支名稱。
差異比較
repo diff [project-list]
使用 git diff 顯示提交內容和工作樹狀結構之間未完成的變更。
下載
repo download target change
從審查系統下載指定變更,並在專案的目前使用的目錄中提供。
舉例來說,如要將 change 23823 下載到 platform/build 目錄,請執行下列指令:
repo download platform/build 23823
執行 repo sync 會移除以 repo download 擷取的任何提交內容。或者,您可以使用 git checkout m/main 查看遠端分支。
forall
repo forall [project-list] -c command
在每個專案中執行指定的殼層指令。repo forall 提供下列額外環境變數:
REPO_PROJECT設為專案的專屬名稱。REPO_PATH是相對於用戶端根目錄的路徑。REPO_REMOTE是資訊清單中的遠端系統名稱。REPO_LREV是資訊清單中的修訂版本名稱,已轉換為本機追蹤分支。如果需要將資訊清單修訂版本傳遞至在本機執行的 Git 指令,請使用這個變數。REPO_RREV是資訊清單中的修訂版本名稱,與資訊清單中的名稱完全相同。
選項:
-c:要執行的指令和引數。系統會透過/bin/sh評估指令,並將其後的任何引數做為殼層位置參數傳遞。-p:在輸出指定指令前顯示專案標頭。方法是將管道繫結至指令的 stdin、stdout 和 stderr 串流,並將所有輸出內容導向連續串流,在單一呼叫器工作階段中顯示。-v:顯示指令寫入 stderr 的訊息。
prune
repo prune [project-list]
修剪 (刪除) 已合併的主題。
開始
repo start branch-name [project-list]
從資訊清單中指定的修訂版本開始,為開發作業建立新分支。
BRANCH_NAME 引數會簡要說明您嘗試對專案進行的變更。如果不知道,請考慮使用名稱 default。
project-list 引數會指定哪些專案參與這個主題分支。
狀態
repo status [project-list]
比較工作樹狀結構與暫存區 (索引),以及每個指定專案中這個分支的最新提交 (HEAD)。針對這三種狀態有差異的每個檔案,顯示摘要行。
如要只查看目前分支的狀態,請執行 repo status .。狀態資訊會依專案列出。專案中的每個檔案都會使用兩個字母的代碼。
第一欄中的大寫字母表示暫存區與上次提交的狀態有何不同。
| Letter | 意義 | 說明 |
|---|---|---|
| - | 不變 | HEAD 和索引中的內容相同 |
| A | 已新增 | 不在 HEAD 中,但在索引中 |
| M | 已修改 | 在 HEAD 中,已在索引中修改 |
| D | 已刪除 | 在 HEAD 中,但不在索引中 |
| R | 已重新命名 | 不在 HEAD 中,索引中的路徑已變更 |
| C | 已複製 | 不在 HEAD 中,從索引中的其他項目複製 |
| T | 模式已變更 | HEAD 和索引中的內容相同,但模式已變更 |
| U | 未合併 | HEAD 與索引之間發生衝突,需要解決 |
第二欄的小寫字母表示工作目錄與索引的差異。
| Letter | 意義 | 說明 |
|---|---|---|
| - | 新/不明 | 不在索引中,但在工作樹狀結構中 |
| 公尺 | 已修改 | 在索引中,在工作樹狀結構中,已修改 |
| d | 已刪除 | 在索引中,但不在工作樹狀結構中 |
處理存放區錯誤
git commit -a # Commit local changes first so they aren't lostrepo start branch-name # Start the branchgit reset --hard HEAD@{1} # Reset the branch so that it matches the commit before repo startrepo upload .
如果未在工作階段開始時執行 repo start 指令,就會顯示 repo: error: no branches ready for upload 錯誤。如要復原,請檢查修訂版本 ID、啟動新分支版本,然後合併。
Git 存放區結構
在 Android 中,Git 存放區 (專案) 不會巢狀化。每個專案都與來源樹狀結構中的特定目錄相關聯,該目錄下的所有子目錄和檔案都屬於同一個專案。請避免使用 Repo 的 git submodule 功能進行 Android 開發。