Android使用repo來管理多個Git項目。它需要一個manifest XML文件來指示這些git項目的屬性。
Manifest
repo manifest XML可以包含下面的元素。
以如下,manifest片段爲例:https://github.com/CyanogenMod/android
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="github"
fetch=".."
review="review.cyanogenmod.org" />
<remote name="private"
fetch="ssh://[email protected]" />
<remote name="aosp"
fetch="https://android.googlesource.com"
review="android-review.googlesource.com"
revision="refs/tags/android-7.1.1_r6" />
<default revision="refs/heads/cm-14.1"
remote="github"
sync-c="true"
sync-j="4" />
<!-- AOSP Projects -->
<project path="build" name="CyanogenMod/android_build" groups="pdk,tradefed">
<copyfile src="core/root.mk" dest="Makefile" />
</project>
<project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" remote="aosp" />
<project path="build/kati" name="CyanogenMod/android_build_kati" groups="pdk,tradefed" />
<project path="build/soong" name="platform/build/soong" groups="pdk,tradefed" remote="aosp" >
<linkfile src="root.bp" dest="Android.bp" />
<linkfile src="bootstrap.bash" dest="bootstrap.bash" />
</project>
<project path="abi/cpp" name="platform/abi/cpp" groups="pdk" remote="aosp" />
<project path="art" name="CyanogenMod/android_art" groups="pdk" />
</manifest>
Manifest元素
最頂層的XML元素。
remote元素
設置遠程git服務器的屬性,包括下面的屬性:
- name: 遠程git服務器的名字,直接用於git fetch, git remote 等操作
- alias: 遠程git服務器的別名,如果指定了,則會覆蓋name的設定。在一個manifest中, name不能重名,但alias可以重名。
- fetch: 所有projects的git URL 前綴
- review: 指定Gerrit的服務器名,用於repo upload操作。如果沒有指定,則repo upload沒有效果。
一個manifest文件中可以配置多個remote元素,用於配置不同的project默認下載指向。
default元素
設定所有projects的默認屬性值,如果在project元素裏沒有指定一個屬性,則使用default元素的屬性值。
- remote: 之前定義的某一個remote元素中name屬性值,用於指定使用哪一個遠程git服務器。
- revision: git分支的名字,例如master或者refs/heads/master
- sync_j: 在repo sync中默認並行的數目。
- sync_c: 如果設置爲true,則只同步指定的分支(revision 屬性指定),而不是所有的ref內容。
- sync_s: 如果設置爲true,則會同步git的子項目
Example:
<default remote="main" revision="platform/main"/>
project元素
指定一個需要clone的git倉庫。
- name: 唯一的名字標識project,同時也用於生成git倉庫的URL。格式如下:
${remote_fetch}/${project_name}.git - path: 可選的路徑。指定git clone出來的代碼存放在本地的子目錄。如果沒有指定,則以name作爲子目錄名。
- remote: 指定之前在某個remote元素中的name。
- revision: 指定需要獲取的git提交點,可以是master, refs/heads/master, tag或者SHA-1值。如果不設置的話,默認下載當前project,當前分支上的最新代碼。
- groups: 列出project所屬的組,以空格或者逗號分隔多個組名。所有的project都自動屬於"all"組。每一個project自動屬於name:'name' 和path:'path'組。
例如<project name="monkeys" path="barrel-of"/>,它自動屬於default, name:monkeys, and path:barrel-of組。如果一個project屬於notdefault組,則,repo sync時不會下載。 - sync_c: 如果設置爲true,則只同步指定的分支(revision 屬性指定),而不是所有的ref內容。
- sync_s: 如果設置爲true,則會同步git的子項目。
- upstream: 在哪個git分支可以找到一個SHA1。用於同步revision鎖定的manifest(-c 模式)。該模式可以避免同步整個ref空間。
- annotation: 可以有多個annotation,格式爲name-value pair。在repo forall 命令中這些值會導入到環境變量中。
- remove-project: 從內部的manifest表中刪除指定的project。經常用於本地的manifest文件,用戶可以替換一個project的定義。
- 子元素
Project元素下面會有兩個子元素。Copyfile和linkfile
<copyfile src="core/root.mk" dest="Makefile" />
<linkfile src="root.bp" dest="Android.bp" />
Copefile:複製,cp src dest
Linkfile:軟鏈接 ,ln -s src dest
Example:
<project groups="aosp" path="device/driver/armv7" revision="600aab270ce712b62b268055737cabcded59bf04"/>
Include元素
通過name屬性可以引入另外一個manifest文件(路徑相對與manifest repository's root)。
Repo
Android 使用 Git 作爲代碼管理工具,開發了 Gerrit 進行代碼審覈以便更好的對代碼進行集中式管理,還開發了 Repo 命令行工具,對 Git 部分命令封裝,將百多個 Git 庫有效的進行組織。
清單庫
所謂的清單庫,就是我們爲manifest文件單獨建的一個庫,一個清單庫可以包含多個清單文件和多個分支,每個清單文件和分支都有對應的版本。我們就是根據不同的manifest文件來下載不同的代碼。
安裝repo
在ubuntu中可以通過命令進行repo的安裝:
Sudo apt-get install repo
也可以直接下載repo文件,然後將路徑配置到環境變量裏面。
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
Repo help
安裝 Repo 後,您可以通過運行以下命令找到最新文檔(開頭是包含所有命令的摘要):
repo help
您可以通過在 Repo 樹中運行以下命令來獲取有關某個命令的信息:
repo help <COMMAND>
例如,以下命令會生成 Repo init 參數的說明和選項列表,該參數會在當前目錄中初始化 Repo。(要了解詳情,請參閱 init。)
repo help init
Repo init
Usage
repo init –u URL [OPTIONS]
在當前目錄中安裝 Repo。這會創建一個 .repo/ 目錄,其中包含用於 Repo 源代碼和標準 Android 清單文件的 Git 代碼庫。該 .repo/ 目錄中還包含 manifest.xml,這是一個指向 .repo/manifests/ 目錄中所選清單的符號鏈接。
Options:
- u:指定一個URL,其連接到一個manifest倉庫
- m:在manifest倉庫中選擇一個xml文件,如果未選擇,默認指向default.xml
- b:選擇一個maniest倉庫中的一個特殊的分支
- --mirror:下一步和源同步的時候,本地按照源的版本庫組織方式進行組織
- --reference=<path>:path爲一個鏡像地址,從鏡像同步代碼。
- --repo-url=<url>:url爲repo 庫的位置,用於修改repo文件中REPO-URL參數的指向。
命令repo init 要完成如下操作:
- 完成repo工具的完整下載,執行的repo腳本只是引導程序
- 克隆清單庫manifest.git (地址來自於-u 參數)
- 克隆的清單庫位於manifest.git中,克隆到本地.repo/manifests.清單.repo/manifest.xml只是符號鏈接,它指.repo/manifests/default.xml
- 如果manifests中有多個xml文件,repo init 可以任意選擇其中一個,默認選擇是default.xml
Repo sync
Usage
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 運行成功後,指定項目中的代碼會與遠程代碼庫中的代碼保持同步。
Option:
- d:將指定項目切換回清單修訂版本。如果項目當前屬於某個主題分支,但只是臨時需要清單修訂版本,則此選項會有所幫助。
- s:同步到當前清單中清單服務器元素指定的一個已知的良好版本。
- f:即使某個項目同步失敗,系統也會繼續同步其他項目。
Repo start
Usage
repo start <BRANCH_NAME> [<PROJECT_LIST>]
從清單中指定的修訂版本開始,創建一個新的分支進行開發。
- <BRANCH_NAME> 參數應簡要說明您嘗試對項目進行的更改。如果您不知道,則不妨考慮使用默認名稱。
- <PROJECT_LIST> 指定了將參與此主題分支的項目。
Repo diff
Usage
repo diff [<PROJECT_LIST>]
使用 git diff 顯示提交與工作樹之間的明顯更改。
Repo prune
Usage
repo prune [<PROJECT_LIST>]
刪減(刪除)已合併的主題。
Repo status
Usage
repo status [<PROJECT_LIST>]
對於每個指定的項目,將工作樹與臨時區域(索引)以及此分支 (HEAD) 上的最近一次提交進行比較。在這三種狀態存在差異之處顯示每個文件的摘要行。
要僅查看當前分支的狀態,請運行 repo status。系統會按項目列出狀態信息。對於項目中的每個文件,系統使用兩個字母的代碼來表示:
在第一列中,大寫字母表示臨時區域與上次提交狀態之間的不同之處。
{|
| 字母 || 含義 || 說明
|-
| - || 無更改 || HEAD 與索引中相同
|-
| A || 已添加 || 不存在於 HEAD 中,但存在於索引中
|-
| M || 已修改 || 存在於 HEAD 中,但索引中的文件已修改
|-
| D || 已刪除 || 存在於 HEAD 中,但不存在於索引中
|-
| R || 已重命名 || 不存在於 HEAD 中,但索引中的文件的路徑已更改
|-
| C || 已複製 || 不存在於 HEAD 中,已從索引中的另一個文件複製
|-
| T || 模式已更改|| HEAD 與索引中的內容相同,但模式已更改
|-
| U || 未合併 || HEAD 與索引之間存在衝突;需要解決方案
|}
在第二列中,小寫字母表示工作目錄與索引之間的不同之處。
{|
| 字母 | 含義 | 說明
|-
| - | 新/未知 | 不存在於索引中,但存在於工作樹中
|-
| m | 已修改 | 存在於索引中,也存在於工作樹中(但已修改)
|-
| d | 已刪除 | 存在於索引中,不存在於工作樹中
|}
Repo forall
Usage
repo forall [<PROJECT_LIST>] -c <COMMAND>
在每個項目中運行指定的 shell 命令。通過 repo forall 可使用下列額外的環境變量:
- REPO_PROJECT 可設爲項目的具有唯一性的名稱。
- REPO_PATH 是客戶端根目錄的相對路徑。
- REPO_REMOTE 是清單中遠程系統的名稱。
- REPO_LREV 是清單中修訂版本的名稱,已轉換爲本地跟蹤分支。如果您需要將清單修訂版本傳遞到某個本地運行的 Git 命令,則可使用此變量。
- REPO_RREV 是清單中修訂版本的名稱,與清單中顯示的名稱完全一致。
Option:
- c:要運行的命令和參數。此命令會通過 /bin/sh 進行求值,它之後的任何參數都將作爲 shell 位置參數傳遞。
- p:在指定命令輸出結果之前顯示項目標頭。這通過以下方式實現:將管道綁定到命令的 stdin、stdout 和 sterr 流,然後通過管道將所有輸出結果傳輸到一個頁面調度會話中顯示的連續流中。
- v:顯示該命令向 stderr 寫入的消息。