Repo 是建立在Git上的一個多倉庫管理工具,可以組織多個倉庫的上傳和下載。Repo是Google用Python腳本寫的調用Git的腳本,主要幫助我們管理多個Git存儲倉庫,將其上傳到我們的版本控制系統,並自動執行Android開發工作流程的某些部分。Repo並不是要取代Git,而是為瞭在Android環境下更加方便的使用Git。下面來看看Repo的具體用法吧!安裝Repo在安裝Repo時,必須先要確保已經安裝瞭Git工具,以及Python2.7+的環境,下面是在Mac下安裝的流程:1、確保主目錄下有一個 bin/ 目錄,並且該目錄包含在路徑中:mkdir ~/bin
PATH=~/bin:$PATH
2、下載 Repo 工具,並確保它可執行:curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
Windows下沒有curl工具可以下載,地址是 https://curl.se/windows/dl-7.74.0_2/curl-7.74.0_2-win64-mingw.zip 。不過也可以直接訪問 https://storage.googleapis.com/git-repo-downloads/repo 網址,直接把內容復制到 ~/bin/repo 效果是一樣的。另外如果googleapis.com無法訪問的話也可以替換為Github的Repo地址:curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo > ~/bin/repo
對於Linux安裝過程可以參考 https://github.com/esrlabs/git-repo 這個倉庫的README其實說得很清楚瞭。Repo的背景使用Repo之前,最好先熟悉Git,關於Git的推薦資料: https://git-scm.com/book/zh/v2 。其實Repo最開始是用來管理Android源代碼庫的,Android 源代碼位於由 Google 托管的 Git 代碼庫中。Git 代碼庫中包含 Android 源代碼的元數據,其中包括與對源代碼進行的更改以及更改日期相關的元數據。而且Android版本庫眾多,版本庫太大以及Git不能部分檢出,如果所有的東西都放在一個庫中,而某個開發團隊比較關心可能隻是某個小組件或者插件而已,但是卻要下載如此龐大的版本庫,所以這一切交給瞭Repo去管理。那麼Repo如何管理多個代碼倉庫的呢?Repo的組成Repo主要包括兩部分:Repo引導腳本(Google 稱之為Repo launcher)和Repo命令的主體部分。那麼Repo倉庫究竟有些什麼東西呢,在我們初始化Repo倉庫之後,會出現一個.repo的文件夾,裡面有如下內容:changlinzou@mac work % tree .repo -L 1
.repo
├── manifest.xml -> manifests/default.xml
├── manifests
├── manifests.git
├── project-objects
├── project.list
├── projects
└── repo
5 directories, 2 files
當執行 repo init 命令來初始化倉庫的時候首先執行的就是Repo的引導腳本,該腳本會到我們指定的地方去下載Manifest 倉庫,以及Repo命令主體部分。下載好之後就放在當前目錄下面的 .repo 目錄下,其中:對於Manifests文件相信每一個Android開發中都不陌生,Android項目中Manifests聲明瞭四大組件,就像列出的項目組件的清單一樣。所以其實很容易類比,在這裡manifests是清單文件的git倉庫,這些xml文件中包含瞭各個git project的名稱,檢出的reversion,檢出到哪個目錄等等信息。Repo就是利用這些manifest文件去分別獲取各個project,比如這樣一個manifest文件:<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="origin" fetch="https://github.com/" review="https://github.com/" />
<default remote="origin" revision="master" sync-j="4" />
<project name="xxx_projects/first.git" path="xxx" />
<project name="yyy_projects/first.git" path="yyy" />
<project name="zzz_lib/first.git" path="xxx/zzz_lib" />
……
</manifest>
下面是Repo的manifest文件中元素的意義:Repo命令下面的內容來自Google的官方文檔: https://source.android.com/source/using-repo.html:使用 Repo 需遵循的格式如下:repo <COMMAND> <OPTIONS>
可選元素顯示在方括號 [ ] 中。例如,許多命令會將項目列表用作參數。您可以為項目指定項目列表,作為名稱列表或本地源代碼目錄的路徑列表: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/ 目錄中所選清單的符號鏈接。選項:-u :指定要從中檢索清單代碼庫的網址。您可以在 https://android.googlesource.com/platform/manifest 中找到常見清單-m :在代碼庫中選擇清單文件。如果未選擇任何清單名稱,則會默認選擇 default.xml。-b :指定修訂版本,即特定的清單分支。註意:對於其餘的所有 Repo 命令,當前工作目錄必須是 .repo/ 的父目錄或相應父目錄的子目錄。syncrepo 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
-f
uploadrepo upload [<PROJECT_LIST>]
對於指定的項目,Repo 會將本地分支與最後一次 repo sync 時更新的遠程分支進行比較。Repo 會提示您選擇一個或多個尚未上傳以供審核的分支。您選擇一個或多個分支後,所選分支上的所有提交都會通過 HTTPS 連接傳輸到 Gerrit。您需要配置一個 HTTPS 密碼以啟用上傳授權。要生成新的用戶名/密碼對以用於 HTTPS 傳輸,請訪問 密碼生成器 。當 Gerrit 通過其服務器接收對象數據時,它會將每項提交轉變成一項更改,以便審核者可以單獨針對每項提交給出意見。要將幾項“檢查點”提交合並為一項提交,請使用 git rebase -i,然後再運行 repo 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.上傳完成後,這些更改將擁有一個額外的補丁程序集。diffrepo diff [<PROJECT_LIST>]
使用 git diff 顯示提交與工作樹之間的明顯更改。downloadrepo download <TARGET> <CHANGE>
從審核系統中下載指定更改,並放在您項目的本地工作目錄中供使用。例如,要將 更改 23823 下載到您的平臺/編譯目錄,請運行以下命令:$ repo download platform/build 23823
repo sync 應該可以有效移除通過 repo download 檢索到的任何提交。或者,您可以將遠程分支檢出,例如 git checkout m/master 。註意:由於全球的所有服務器均存在復制延遲,因此某項更改(位於 Gerrit 中)出現在網絡上的時間與所有用戶可通過 repo download 找到此項更改的時間之間存在些許的鏡像延遲。forallrepo forall [<PROJECT_LIST>] -c <COMMAND>
在每個項目中運行指定的 shell 命令。通過 repo forall 可使用下列額外的環境變量:REPO_PROJECT
REPO_PATH
REPO_REMOTE
REPO_LREV
REPO_RREV
選項:-c :要運行的命令和參數。此命令會通過 /bin/sh 進行求值,它之後的任何參數都將作為 shell 位置參數傳遞。-p :在指定命令輸出結果之前顯示項目標頭。這通過以下方式實現:將管道綁定到命令的 stdin、stdout 和 sterr 流,然後通過管道將所有輸出結果傳輸到一個頁面調度會話中顯示的連續流中。-v :顯示該命令向 stderr 寫入的消息。prunerepo prune [<PROJECT_LIST>]
刪減(刪除)已合並的主題。startrepo start <BRANCH_NAME> [<PROJECT_LIST>]
從清單中指定的修訂版本開始,創建一個新的分支進行開發。*<BRANCH_NAME>* 參數應簡要說明您嘗試對項目進行的更改。如果您不知道,則不妨考慮使用默認名稱。*<PROJECT_LIST>* 指定瞭將參與此主題分支的項目。註意:“.”是一個非常實用的簡寫形式,用來代表當前工作目錄中的項目。statusrepo status [<PROJECT_LIST>]
對於每個指定的項目,將工作樹與臨時區域(索引)以及此分支 (HEAD) 上的最近一次提交進行比較。在這三種狀態存在差異之處顯示每個文件的摘要行。要僅查看當前分支的狀態,請運行 repo status 。系統會按項目列出狀態信息。對於項目中的每個文件,系統使用兩個字母的代碼來表示:在第一列中,大寫字母表示臨時區域與上次提交狀態之間的不同之處。在第二列中,小寫字母表示工作目錄與索引之間的不同之處。看完三件事❤️如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。關註頭條號 『 JAVA後端架構 』,不定期分享原創知識。同時可以期待後續文章ing關註作者後臺私信【888】有驚喜相送
本文出自快速备案,转载时请注明出处及相应链接。