文章目錄
1 what’s repo
Android 使用 Git 作為代碼管理工具,開發了 Gerrit 進行代碼審核以便更好的對代碼進行集中式管理,還開發了 repo 命令行工具,實際上python
指令對git
的一層封裝,對 git
部分命令封裝,將百多個 git
庫有效的進行組織,因為源碼倉庫數量龐大,使用git
進行管理會帶來很多不便,這里repo
就體現了其優越性。
2 官方文檔
該部分轉自官網參考文檔,比較有參考價值,按照這里文檔內容,基本上大部分問題都可以解決了,筆者根據實際使用的情況,做了一部分補充。ctrl+c
和ctrl+v
來一波,”問題都解決了“。
Repo 命令參考資料
使用 Repo 需遵循的格式如下:
repo command options
可選元素顯示在方括號 [ ] 中。例如,許多命令會用到項目列表 (project-list) 參數。項目列表可以是一個名稱列表,也可以是一個本地源代碼目錄的路徑列表:
repo sync [project0 project1 ... projectn]
repo sync [/path/to/project0 ... /path/to/projectn]
help 幫助
安裝 Repo 后,您可以通過運行以下命令找到最新文檔(開頭是包含所有命令的摘要):
repo help
您可以通過在 Repo 樹中運行以下命令來獲取有關某個命令的信息:
repo help command
例如,以下命令會生成 Repo init
參數的說明和選項列表,該參數會在當前目錄中初始化 Repo(要了解詳情,請參閱 init)。
repo help init
init 初始化
repo init -u url [options]
在當前目錄中安裝 Repo。這會創建一個 .repo/
目錄,其中包含用於 Repo 源代碼和標准 Android 清單文件的 Git 代碼庫。該 .repo/
目錄中還包含 manifest.xml
,這是一個指向 .repo/manifests/
目錄中所選清單的符號鏈接。有關更新清單的說明,請參閱 manifest-format.md。
選項:
-u
:指定要從中檢索清單代碼庫的網址。您可以在https://android.googlesource.com/platform/manifest
中找到通用清單-m
:選擇代碼庫中的一個清單文件。如果未選擇任何清單名稱,則會默認選擇 default.xml。-b
:指定修訂版本,即特定的清單分支。
注意:對於其余的所有 Repo 命令,當前工作目錄必須是 .repo/
的父目錄或相應父目錄的子目錄。
sync 同步所有項目文件
repo sync [project-list]
下載新的更改並更新本地環境中的工作文件。如果您在未使用任何參數的情況下運行 repo sync
,則該操作會同步所有項目的文件。
運行 repo sync
后,將出現以下情況:
-
如果目標項目從未同步過,則
repo sync
相當於git clone
。遠程代碼庫中的所有分支都會復制到本地項目目錄中。 -
如果目標項目以前同步過,則
repo sync
相當於以下命令:git remote update git rebase origin/branch
其中
branch
是本地項目目錄中當前已檢出的分支。如果本地分支沒有在跟蹤遠程代碼庫中的分支,則相應項目不會發生任何同步。 -
如果 git rebase 操作導致合並沖突,請使用常規 Git 命令(例如
git rebase --continue
)來解決沖突。
repo sync
運行成功后,指定項目中的代碼即處於最新狀態,已與遠程代碼庫中的代碼同步。
選項:
-d
:將指定項目切換回清單修訂版本。如果項目當前屬於某個主題分支,但臨時需要清單修訂版本,則此選項會有所幫助。-s
:同步到當前清單中的 manifest-server 元素指定的一個已知良好版本。-f
:即使某個項目同步失敗,也繼續同步其他項目。
upload 提交更改
repo upload [project-list]
對於指定的項目,Repo 會將本地分支與最后一次 repo sync 時更新的遠程分支進行比較。Repo 會提示您選擇一個或多個尚未上傳以供審核的分支。
接下來,所選分支上的所有提交都會通過 HTTPS 連接傳輸到 Gerrit。您需要配置一個 HTTPS 密碼以啟用上傳授權。要生成新的用戶名/密碼對以用於 HTTPS 傳輸,請訪問密碼生成器。
當 Gerrit 通過其服務器接收對象數據時,它會將每項提交轉變成一項更改,以便審核者可以針對特定提交給出意見。要將幾項“檢查點”提交合並為一項提交,請使用 git rebase -i
,然后再運行 upload。
如果您在未使用任何參數的情況下運行 repo upload
,則該操作會搜索所有項目中的更改以進行上傳。
要在更改上傳后對其進行修改,請使用 git rebase -i
或 git commit --amend
等工具更新您的本地提交。修改完成之后,請執行以下操作:
-
進行驗證以確保更新后的分支是當前已檢出的分支。
-
對於相應系列中的每項提交,請在方括號內輸入 Gerrit 更改 ID:
# Replacing from branch foo [ 3021 ] 35f2596c Refactor part of GetUploadableBranches to lookup one specific... [ 2829 ] ec18b4ba Update proto client to support patch set replacments # 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
)。
diff
repo diff [project-list]
使用 git diff
顯示提交與工作樹之間的明顯更改。
download
repo download target change
從審核系統中下載指定更改,並放在您項目的本地工作目錄中供使用。
例如,要將更改 23823 下載到您的平台/編譯目錄,請運行以下命令:
repo download platform/build 23823
運行 repo sync
應該可以移除通過 repo download
檢索到的任何提交。或者,您可以使用 git checkout m/master
將遠程分支檢出。
注意:由於全球的所有服務器均存在復制延遲,因此某項更改出現在網絡上(位於 Gerrit 中)的時間與所有用戶可通過 repo download
找到此項更改的時間之間存在些許的鏡像延遲。
forall
repo forall [project-list] -c command
在每個項目中運行指定的 shell 命令。通過 repo forall
可使用下列額外的環境變量:
REPO_PROJECT
設為了項目的唯一名稱。REPO_PATH
是相對於客戶端根目錄的路徑。REPO_REMOTE
是清單中遠程系統的名稱。REPO_LREV
是清單中修訂版本的名稱,已轉換為本地跟蹤分支。如果您需要將清單修訂版本傳遞到某個本地運行的 Git 命令,則可使用此變量。REPO_RREV
是清單中修訂版本的名稱,與清單中顯示的名稱完全一致。
選項:
-c
:要運行的命令和參數。此命令會通過/bin/sh
進行評估,它之后的任何參數都將作為 shell 位置參數傳遞。-p
:在所指定命令的輸出結果之前顯示項目標頭。這通過以下方式實現:將管道綁定到命令的 stdin、stdout 和 sterr 流,然后通過管道將所有輸出結果傳輸到一個分頁會話中顯示的連續流中。-v
:顯示該命令向 stderr 寫入的消息。
prune
repo prune [project-list]
刪減(刪除)已合並的主題。
start 創建本地分支
repo start branch-name [project-list]
從清單中指定的修訂版本開始,創建一個新的分支進行開發。
BRANCH_NAME
參數用於簡要說明您嘗試對項目進行的更改。如果您不知道,則不妨考慮使用名稱 default
。
project-list
參數指定了將參與此主題分支的項目。
注意:句點 (.) 是一個簡寫形式,用來代表當前工作目錄中的項目。
Example:創建三個分支test-1,test-2,test-3
repo start test-1 --all
repo start test-2 --all
repo start test-3 --all
status
repo status [project-list]
對於每個指定的項目,將工作樹與臨時區域(索引)以及此分支 (HEAD) 上的最近一次提交進行比較。在這三種狀態存在差異之處顯示每個文件的摘要行。
要僅查看當前分支的狀態,請運行 repo status
。系統會按項目列出狀態信息。對於項目中的每個文件,系統使用兩個字母的代碼來表示:
在第一列中,大寫字母表示臨時區域與上次提交狀態之間的不同之處。
字母 | 含義 | 說明 |
---|---|---|
- | 沒有變化 | 在 HEAD 與索引中相同 |
A | 已添加 | 不存在於 HEAD 中,但存在於索引中 |
M | 已修改 | 存在於 HEAD 中,但索引中的文件已修改 |
D | 已刪除 | 存在於 HEAD 中,但不存在於索引中 |
R | 已重命名 | 不存在於 HEAD 中,索引中文件的路徑已更改 |
C | 已復制 | 不存在於 HEAD 中,復制自索引中的另一個文件 |
T | 模式已更改 | HEAD 與索引中的內容相同,但模式已更改 |
U | 未合並 | HEAD 與索引之間存在沖突;需要加以解決 |
在第二列中,小寫字母表示工作目錄與索引之間的不同之處。
字母 | 含義 | 說明 |
---|---|---|
- | 新/未知 | 不存在於索引中,但存在於工作樹中 |
m | 已修改 | 存在於索引中,也存在於工作樹中(但已修改) |
d | 已刪除 | 存在於索引中,但不存在於工作樹中 |
branches
查看當前所有分支,相當於git
下的指令git branch -a
repo branches
已經創建了三個分支了
test-1 | in all projects
test-2 | in all projects
* test-3 | in all projects
abandon
刪除本地已經存在的某個分支,相當於git branch -d <branch-name>
repo abandon [branch-name]
Example:刪除本地分支test-3
repo adbandon test-3