參考 官方項(xiàng)目地址
參考 官方文檔
參考 Overview
要處理 Android 代碼能曾,您需要同時(shí)使用 Git 和 Repo。在大多數(shù)情況下浦译,您可以僅使用 Git(不必使用 Repo),或結(jié)合使用 Repo 和 Git 命令以組成復(fù)雜的命令。不過钠绍,使用 Repo 執(zhí)行基本的跨網(wǎng)絡(luò)操作可大大簡化您的工作。
Git 是一個(gè)開放源代碼的版本控制系統(tǒng)花沉,專用于處理分布在多個(gè)代碼庫上的大型項(xiàng)目柳爽。在 Android 環(huán)境中,我們會(huì)使用 Git 執(zhí)行本地操作碱屁,例如建立本地分支磷脯、提交、查看更改娩脾、修改赵誓。打造 Android 項(xiàng)目所面臨的挑戰(zhàn)之一就是確定如何最好地支持外部社區(qū) - 從業(yè)余愛好者社區(qū)到生產(chǎn)大眾消費(fèi)類設(shè)備的大型原始設(shè)備制造商 (OEM)。我們希望組件可以替換,并希望有趣的組件能夠在 Android 之外自行發(fā)展俩功。我們最初決定使用一種分布式修訂版本控制系統(tǒng)隘冲,經(jīng)過篩選,最后選中了 Git绑雄。
Repo 是我們以 Git 為基礎(chǔ)構(gòu)建的代碼庫管理工具。Repo 可以在必要時(shí)整合多個(gè) Git 代碼庫奥邮,將相關(guān)內(nèi)容上傳到我們的修訂版本控制系統(tǒng)万牺,并自動(dòng)執(zhí)行 Android 開發(fā)工作流程的部分環(huán)節(jié)。Repo 并非用來取代 Git洽腺,只是為了讓您在 Android 環(huán)境中更輕松地使用 Git脚粟。Repo 命令是一段可執(zhí)行的 Python 腳本,您可以將其放在路徑中的任何位置蘸朋。使用 Android 源代碼文件時(shí)核无,您可以使用 Repo 執(zhí)行跨網(wǎng)絡(luò)操作。例如藕坯,您可以借助單個(gè) Repo 命令团南,將文件從多個(gè)代碼庫下載到本地工作目錄。
Gerrit 是一個(gè)基于網(wǎng)頁的代碼審核系統(tǒng)炼彪,適用于使用 Git 的項(xiàng)目吐根。Gerrit 允許所有授權(quán)用戶提交更改(如果通過代碼審核,這些更改會(huì)自動(dòng)納入項(xiàng)目中)辐马,以此鼓勵(lì)他們更集中地使用 Git拷橘。此外,Gerrit 可以在瀏覽器中并排顯示更改喜爷,并支持代碼內(nèi)注釋冗疮,使得審核工作變得更輕松。
一檩帐、開發(fā)
1.1 基本工作流程
與代碼庫進(jìn)行交互的基本模式如下:
- 使用 repo start 新建一個(gè)主題分支术幔。
- 修改文件。
- 使用 git add 暫存更改轿塔。
- 使用 git commit 提交更改特愿。
- 使用 repo upload 將更改上傳到審核服務(wù)器。
圖 1. Android 基本工作流程
二勾缭、使用Repo
使用 Repo 需遵循的格式如下:
repo <COMMAND> <OPTIONS>
可選元素顯示在方括號(hào) [ ]
中揍障。例如,許多命令會(huì)將項(xiàng)目列表用作參數(shù)俩由。您可以為項(xiàng)目指定項(xiàng)目列表毒嫡,作為名稱列表或本地源代碼目錄的路徑列表:
repo sync [<PROJECT0> <PROJECT1> <PROJECTN>]
repo sync [</PATH/TO/PROJECT0> ... </PATH/TO/PROJECTN>]
2.1 help
repo help
repo help <COMMAND>
repo help init
2.2 init 當(dāng)前目錄安裝repo 創(chuàng)建.repo目錄
$ repo init -u <URL> [<OPTIONS>]
在當(dāng)前目錄中安裝 repo。這會(huì)創(chuàng)建一個(gè) .repo/ 目錄,其中包含用于 repo 源代碼和標(biāo)準(zhǔn) Android 清單文件的 Git 代碼庫兜畸。該 .repo/ 目錄中還包含 manifest.xml努释,這是一個(gè)指向 .repo/manifests/ 目錄中所選清單的符號(hào)鏈接。
選項(xiàng):
-u:指定要從中檢索清單代碼庫的網(wǎng)址咬摇。您可以在 https://android.googlesource.com/platform/manifest
中找到常見清單
-m:在代碼庫中選擇清單文件伐蒂。如果未選擇任何清單名稱,則會(huì)默認(rèn)選擇 default.xml肛鹏。
-b:指定修訂版本逸邦,即特定的清單分支。
注意:對(duì)于其余的所有 repo 命令在扰,當(dāng)前工作目錄必須是 .repo/ 的父目錄或相應(yīng)父目錄的子目錄缕减。
2.3 sync 同步新的更改到本地
repo sync [<PROJECT_LIST>]
下載新的更改并更新本地環(huán)境中的工作文件。如果您在未使用任何參數(shù)的情況下運(yùn)行 repo sync芒珠,則該操作會(huì)同步所有項(xiàng)目的文件桥狡。
運(yùn)行 repo sync 后,將出現(xiàn)以下情況:
如果目標(biāo)項(xiàng)目從未同步過皱卓,則 repo sync 相當(dāng)于 git clone裹芝。遠(yuǎn)程代碼庫中的所有分支都會(huì)復(fù)制到本地項(xiàng)目目錄中。
-
如果目標(biāo)項(xiàng)目已同步過好爬,則 repo sync 相當(dāng)于以下命令:
git remote update git rebase origin/<BRANCH>
其中 <BRANCH> 是本地項(xiàng)目目錄中當(dāng)前已檢出的分支局雄。如果本地分支沒有在跟蹤遠(yuǎn)程代碼庫中的分支,則相應(yīng)項(xiàng)目不會(huì)發(fā)生任何同步存炮。
如果 git rebase 操作導(dǎo)致合并沖突炬搭,那么您需要使用普通 Git 命令(例如 git rebase --continue)來解決沖突。
repo sync 運(yùn)行成功后穆桂,指定項(xiàng)目中的代碼會(huì)與遠(yuǎn)程代碼庫中的代碼保持同步宫盔。
選項(xiàng):
-d:將指定項(xiàng)目切換回清單修訂版本。如果項(xiàng)目當(dāng)前屬于某個(gè)主題分支享完,但只是臨時(shí)需要清單修訂版本灼芭,則此選項(xiàng)會(huì)有所幫助。
-s:同步到當(dāng)前清單中清單服務(wù)器元素指定的一個(gè)已知的良好版本般又。
-f:即使某個(gè)項(xiàng)目同步失敗彼绷,系統(tǒng)也會(huì)繼續(xù)同步其他項(xiàng)目。
2.3 upload
repo upload [<PROJECT_LIST>]
對(duì)于指定的項(xiàng)目茴迁,Repo 會(huì)將本地分支與最后一次 repo sync 時(shí)更新的遠(yuǎn)程分支進(jìn)行比較寄悯。Repo 會(huì)提示您選擇一個(gè)或多個(gè)尚未上傳以供審核的分支。
您選擇一個(gè)或多個(gè)分支后堕义,所選分支上的所有提交都會(huì)通過 HTTPS 連接傳輸?shù)?Gerrit猜旬。您需要配置一個(gè) HTTPS 密碼以啟用上傳授權(quán)。要生成新的用戶名/密碼對(duì)以用于 HTTPS 傳輸,請(qǐng)?jiān)L問密碼生成器洒擦。
當(dāng) Gerrit 通過其服務(wù)器接收對(duì)象數(shù)據(jù)時(shí)椿争,它會(huì)將每項(xiàng)提交轉(zhuǎn)變成一項(xiàng)更改,以便審核者可以單獨(dú)針對(duì)每項(xiàng)提交給出意見熟嫩。要將幾項(xiàng)“檢查點(diǎn)”提交合并為一項(xiàng)提交秦踪,請(qǐng)使用 git rebase -i,然后再運(yùn)行 repo upload掸茅。
如果您在未使用任何參數(shù)的情況下運(yùn)行 repo upload洋侨,則該操作會(huì)搜索所有項(xiàng)目中的更改以進(jìn)行上傳。
要在更改上傳之后對(duì)其進(jìn)行修改倦蚪,您應(yīng)該使用 git rebase -i 或 git commit --amend 等工具更新您的本地提交。修改完成之后边苹,請(qǐng)執(zhí)行以下操作:
- 進(jìn)行核對(duì)以確保更新后的分支是當(dāng)前已檢出的分支陵且。
- 對(duì)于相應(yīng)系列中的每項(xiàng)提交,請(qǐng)?jiān)诜嚼ㄌ?hào)內(nèi)輸入 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.
上傳完成后个束,這些更改將擁有一個(gè)額外的補(bǔ)丁程序集慕购。
2.4 diff
repo diff [<PROJECT_LIST>]
使用 git diff 顯示提交與工作樹之間的明顯更改。
2.5 download
repo download <TARGET> <CHANGE>
從審核系統(tǒng)中下載指定更改茬底,并放在您項(xiàng)目的本地工作目錄中供使用沪悲。
例如,要將更改 23823 下載到您的平臺(tái)/編譯目錄阱表,請(qǐng)運(yùn)行以下命令:
$ repo download platform/build 23823
repo sync 應(yīng)該可以有效移除通過 repo download 檢索到的任何提交殿如。或者最爬,您可以將遠(yuǎn)程分支檢出涉馁,例如 git checkout m/master。
注意:由于全球的所有服務(wù)器均存在復(fù)制延遲爱致,因此某項(xiàng)更改(位于 Gerrit 中)出現(xiàn)在網(wǎng)絡(luò)上的時(shí)間與所有用戶可通過 repo download 找到此項(xiàng)更改的時(shí)間之間存在些許的鏡像延遲烤送。
2.6 forall
repo forall [<PROJECT_LIST>] -c <COMMAND>
在每個(gè)項(xiàng)目中運(yùn)行指定的 shell 命令。通過 repo forall 可使用下列額外的環(huán)境變量:
-
REPO_PROJECT
可設(shè)為項(xiàng)目的具有唯一性的名稱糠悯。 -
REPO_PATH
是客戶端根目錄的相對(duì)路徑帮坚。 -
REPO_REMOTE
是清單中遠(yuǎn)程系統(tǒng)的名稱。 -
REPO_LREV
是清單中修訂版本的名稱互艾,已轉(zhuǎn)換為本地跟蹤分支试和。如果您需要將清單修訂版本傳遞到某個(gè)本地運(yùn)行的 Git 命令,則可使用此變量忘朝。 -
REPO_RREV
是清單中修訂版本的名稱灰署,與清單中顯示的名稱完全一致。
選項(xiàng):
-c:要運(yùn)行的命令和參數(shù)。此命令會(huì)通過 /bin/sh 進(jìn)行求值溉箕,它之后的任何參數(shù)都將作為 shell 位置參數(shù)傳遞晦墙。
-p:在指定命令輸出結(jié)果之前顯示項(xiàng)目標(biāo)頭。這通過以下方式實(shí)現(xiàn):將管道綁定到命令的 stdin肴茄、stdout 和 sterr 流晌畅,然后通過管道將所有輸出結(jié)果傳輸?shù)揭粋€(gè)頁面調(diào)度會(huì)話中顯示的連續(xù)流中。
-v:顯示該命令向 stderr 寫入的消息寡痰。
示例:清除本地修改
repo forall -vc "git reset --hard"
2.7 prune
repo prune [<PROJECT_LIST>]
刪減(刪除)已合并的主題抗楔。
2.8 start
repo start <BRANCH_NAME> [<PROJECT_LIST>]
從清單中指定的修訂版本開始,創(chuàng)建一個(gè)新的分支進(jìn)行開發(fā)拦坠。
<BRANCH_NAME> 參數(shù)應(yīng)簡要說明您嘗試對(duì)項(xiàng)目進(jìn)行的更改连躏。如果您不知道,則不妨考慮使用默認(rèn)名稱贞滨。
<PROJECT_LIST> 指定了將參與此主題分支的項(xiàng)目入热。
注意:“.”是一個(gè)非常實(shí)用的簡寫形式,用來代表當(dāng)前工作目錄中的項(xiàng)目晓铆。
2.9 status
repo status [<PROJECT_LIST>]
對(duì)于每個(gè)指定的項(xiàng)目勺良,將工作樹與臨時(shí)區(qū)域(索引)以及此分支 (HEAD) 上的最近一次提交進(jìn)行比較。在這三種狀態(tài)存在差異之處顯示每個(gè)文件的摘要行骄噪。
要僅查看當(dāng)前分支的狀態(tài)尚困,請(qǐng)運(yùn)行 repo status。系統(tǒng)會(huì)按項(xiàng)目列出狀態(tài)信息链蕊。對(duì)于項(xiàng)目中的每個(gè)文件事甜,系統(tǒng)使用兩個(gè)字母的代碼來表示:
在第一列中,大寫字母表示臨時(shí)區(qū)域與上次提交狀態(tài)之間的不同之處滔韵。
字母 含義 說明
- 無更改 HEAD 與索引中相同
A 已添加 不存在于 HEAD 中讳侨,但存在于索引中
M 已修改 存在于 HEAD 中,但索引中的文件已修改
D 已刪除 存在于 HEAD 中奏属,但不存在于索引中
R 已重命名 不存在于 HEAD 中跨跨,但索引中的文件的路徑已更改
C 已復(fù)制 不存在于 HEAD 中,已從索引中的另一個(gè)文件復(fù)制
T 模式已更改 HEAD 與索引中的內(nèi)容相同囱皿,但模式已更改
U 未合并 HEAD 與索引之間存在沖突勇婴;需要解決方案
在第二列中,小寫字母表示工作目錄與索引之間的不同之處嘱腥。
字母 含義 說明
- 新/未知 不存在于索引中耕渴,但存在于工作樹中
m 已修改 存在于索引中,也存在于工作樹中(但已修改)
d 已刪除 存在于索引中齿兔,不存在于工作樹中