Manifest和Repo使用詳解

Android使用repo來管理多個Git項目。它須要一個manifest  XML文件來指示這些git項目的屬性。android

Manifest

repo manifest XML能夠包含下面的元素。
以以下,manifest片斷爲例:https://github.com/CyanogenMod/androidgit

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="github"
           fetch=".."
           review="review.cyanogenmod.org" />
  <remote  name="private"
           fetch="ssh://git@github.com" />
  <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元素。github

remote元素

設置遠程git服務器的屬性,包括下面的屬性:shell

  • 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默認下載指向。bootstrap

default元素

設定全部projects的默認屬性值,若是在project元素裏沒有指定一個屬性,則使用default元素的屬性值。ubuntu

  • remote: 以前定義的某一個remote元素中name屬性值,用於指定使用哪個遠程git服務器。
  • revision: git分支的名字,例如master或者refs/heads/master
  • sync_j: 在repo sync中默認並行的數目。
  • sync_c: 若是設置爲true,則只同步指定的分支(revision 屬性指定),而不是全部的ref內容。
  • sync_s: 若是設置爲true,則會同步git的子項目

Example:api

<default remote="main" revision="platform/main"/>

  

project元素

指定一個須要clone的git倉庫。bash

  • 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 庫有效的進行組織。ssh

清單庫

所謂的清單庫,就是咱們爲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 寫入的消息。
相關文章
相關標籤/搜索