repo工具的使用詳解

參考 官方項(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)行交互的基本模式如下:

  1. 使用 repo start 新建一個(gè)主題分支术幔。
  2. 修改文件。
  3. 使用 git add 暫存更改轿塔。
  4. 使用 git commit 提交更改特愿。
  5. 使用 repo upload 將更改上傳到審核服務(wù)器。
基本工作流程.png

圖 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)以下情況:

  1. 如果目標(biāo)項(xiàng)目從未同步過皱卓,則 repo sync 相當(dāng)于 git clone裹芝。遠(yuǎn)程代碼庫中的所有分支都會(huì)復(fù)制到本地項(xiàng)目目錄中。

  2. 如果目標(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ā)生任何同步存炮。

  3. 如果 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   已刪除 存在于索引中齿兔,不存在于工作樹中
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橱脸,一起剝皮案震驚了整個(gè)濱河市础米,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌添诉,老刑警劉巖屁桑,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栏赴,居然都是意外死亡蘑斧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門须眷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竖瘾,“玉大人,你說我怎么就攤上這事花颗〔洞” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵扩劝,是天一觀的道長乐横。 經(jīng)常有香客問我,道長今野,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任罐农,我火速辦了婚禮条霜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涵亏。我一直安慰自己宰睡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布气筋。 她就那樣靜靜地躺著拆内,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宠默。 梳的紋絲不亂的頭發(fā)上麸恍,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音搀矫,去河邊找鬼抹沪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瓤球,可吹牛的內(nèi)容都是我干的融欧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卦羡,長吁一口氣:“原來是場噩夢啊……” “哼噪馏!你這毒婦竟也來了麦到?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤欠肾,失蹤者是張志新(化名)和其女友劉穎瓶颠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體董济,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡步清,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虏肾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廓啊。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖封豪,靈堂內(nèi)的尸體忽然破棺而出谴轮,到底是詐尸還是另有隱情,我是刑警寧澤吹埠,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布第步,位于F島的核電站,受9級(jí)特大地震影響缘琅,放射性物質(zhì)發(fā)生泄漏粘都。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一刷袍、第九天 我趴在偏房一處隱蔽的房頂上張望翩隧。 院中可真熱鬧,春花似錦呻纹、人聲如沸堆生。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淑仆。三九已至,卻和暖如春哥力,著一層夾襖步出監(jiān)牢的瞬間蔗怠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工吩跋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蟀淮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓钞澳,卻偏偏與公主長得像怠惶,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轧粟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容