Repo實踐指南

Repo介紹

Android 使用 Git 做爲代碼管理工具,開發了Gerrit進行代碼審覈以便更好的對代碼進行集中式管理,還開發了Repo命令行工具,對Git部分命令封裝,將百多個Git庫有效的進行組織。android

Repo工具下載

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

清單庫文件介紹

一個清單庫能夠包含多個清單文件和多個分支,每一個清單文件和分支都有對應的版本。清單文件以xml格式組織的。舉個例子:git

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0_r27
<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  <remote  name="aosp"
           fetch=".."
           review="https://android-review.googlesource.com/" />
  <default revision="refs/tags/android-11.0.0_r27"
           remote="aosp"
           sync-j="4" />

  <project path="build/make" name="platform/build" groups="pdk" >
    <copyfile src="core/root.mk" dest="Makefile" />
    <linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />
    <linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" />
    <linkfile src="core" dest="build/core" />
    <linkfile src="envsetup.sh" dest="build/envsetup.sh" />
    <linkfile src="target" dest="build/target" />
    <linkfile src="tools" dest="build/tools" />
  </project>
  <project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" />
  ...
</manifest>
  • remote元素,定義了名爲aosp的遠程版本庫,其庫的基址爲https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform,還定義了代碼審覈服務器的地址https://android-review.googlesource.com/。固然,還能夠定義更多的remote元素。
  • default元素,設置各個項目默認遠程版本庫爲aosp,默認的的分支爲refs/tags/android-11.0.0_r27。固然各個project元素還能夠定義本身的remote和revision覆蓋默認的配置。
  • project元素,用於定義一個項目,path屬性表示在工做區克隆的位置,name屬性表示該項目的遠程版本庫的相對路徑。
  • project元素的子元素copyfile,定義了項目克隆後的一個附件動做,從src拷貝文件到dest。

repo經常使用指令

repo init (下載repo並克隆manifest)

repo init –u URL [OPTIONS]
  • -u:指定一個URL,其鏈接到一個maniest倉庫
  • -m:在manifest倉庫中選擇一個xml文件
  • -b:選擇一個maniest倉庫中的一個特殊的分支

命令repo init 要完成以下操做:shell

  • 完成repo工具的完整下載,執行的repo腳本只是引導程序
  • 克隆清單庫manifest.git (地址來自於-u 參數)
  • 克隆的清單庫位於manifest.git中,克隆到本地.repo/manifests。在以前的repo版本中清單.repo/manifest.xml只是符號連接,它指向.repo/manifests/default.xml。在目前的repo版本中清單.repo/manifest.xml是一個實際的文件,經過include的方式引用.repo/manifests/default.xml
  • 若是manifests中有多個xml文件,repo init 能夠任意選擇其中一個,默認選擇是default.xml
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0_r27 # 在當前目錄出現了.repo文件夾
repo init -u git://172.16.1.31/manifest.git –m android.xml # 選擇的是android.xml裏面的配置,.repo/manifest.xml便指向.repo/manifests/android.xml

repo sync(下載代碼)

repo sync [<project>…]

用於參照清單文件.repo/manifest.xml克隆並同步版本庫。若是某個項目版本庫尚不存在,則執行repo sync 命令至關於執行git clone,若是項目版本庫已經存在,則至關於執行下面的兩條指令:api

git remote update # 至關於對每個remote源執行了fetch操做
git rebase origin/branch # 針對當前分支的跟蹤分支執行rebase操做
repo sync
repo sync platform/build # 也能夠選擇克隆其中的一個項目

repo start(建立並切換分支)

repo start  <newbranchname> [--all | <project>…]

剛克隆下來的代碼是沒有分支的,repo start實際是對git checkout –b 命令的封裝。爲指定的項目或全部項目(若使用—all參數),以清單文件中爲設定的分支,建立特性分支。這條指令與git checkout –b 仍是有很大的區別的,git checkout –b 是在當前所在的分支的基礎上建立特性分支,而repo start是在清單文件設定分支的基礎上建立特性分支。服務器

repo start stable --all # 假設清單文件中設定的分支是gingerbread-exdroid-stable,那麼執行以上指令就是對全部項目,在gingerbread-exdroid-stable的基礎上建立特性分支stable
repo start stable platform/build platform/bionic # 假設清單文件中設定的分支是gingerbread-exdroid-stable,那麼執行以上指令就是對platform/build、platform/bionic項目,在gingerbread-exdroid-stable的基礎上建立特性分支stable

repo checkout(切換分支)

repo checkout <branchname>  [<project>…]

其實是對git checkout 命令的封裝,但不能帶-b參數,因此不能用此命令來建立特性分支。ssh

repo checkout crane-dev 
repo checkout crane-dev  platform/build  platform/bionic

repo branches(查看分支)

repo branches [<project>…]
repo branches 
repo branches platform/build platform/bionic

repo diff(查看工做區文件差別)

repo diff [<project>…]

實際是對git diff 命令的封裝,用於分別顯示各個項目工做區下的文件差別。curl

repo diff # 查看全部項目
repo diff platform/build platform/bionic # 只查看其中兩個項目

repo stage(把文件添加到index表中)

實際是對git add --interactive命令的封裝、用於挑選各個項目工做區中的改動以加入暫存區。ionic

repo stage -i [<project>…]

-i表明git add --interactive命令中的--interactive,給出個界面供用戶選擇工具

repo prune(刪除已經合併分支)

其實是對git branch –d命令的封裝,該命令用於掃面項目的各個分支,並刪除已經合併的分支,用法以下:fetch

repo prune [<project>…]

repo abandon(刪除指定分支)

其實是對git branch –D 命令的封裝,用法以下:

repo abandon <branchname> [<project>…]

repo status(查看文件狀態)

其實是對git diff-index、git diff-filse命令的封裝,同時顯示暫存區的狀態和本地文件修改的狀態

repo status platform/bionic

以上的實例輸出顯示了platform/bionic項目分支的修改狀態

  • 每一個小節的首行顯示羨慕名稱,以及所在分支的名稱
  • 第一個字母表示暫存區的文件修改狀態
    • -:沒有改變
    • A:添加(不在HEAD中,在暫存區中)
    • M:修改(在HEAD中,在暫存區中,內容不一樣)
    • D:刪除(在HEAD中,不在暫存區)
    • R:重命名(不在HEAD中,在暫存區,路徑修改)
    • C:拷貝(不在HEAD中,在暫存區,從其餘文件拷貝)
    • T:文件狀態改變(在HEAD中,在暫存區,內容相同)
    • U:未合併,須要衝突解決
  • 第二個字母表示工做區文件的更改狀態
    • -:新/未知(不在暫存區,在工做區)
    • m:修改(在暫存區,在工做區,被修改)
    • d:刪除(在暫存區,不在工做區)
  • 兩個表示狀態的字母后面,顯示文件名信息。若是有文件重名還會顯示改變先後的文件名及文件的類似度

repo remote(設置遠程倉庫)

repo remote add <remotename>  <url> [<project>…] 
repo remote rm <remotename>  [<project>…]
repo remote add org ssh://172.16.1.31/git_repo # 這個指令是根據xml文件添加的遠程分支,方便於向服務器提交代碼,執行以後的build目錄下看到新的遠程分支org
repo remote rm org # 刪除遠程倉庫

repo push

repo push <remotename> [--all |<project>…]

這是新添加的指令,用於向服務器提交代碼,repo會本身查詢須要向服務器提交的項目並提示用戶。

repo push org

repo forall

repo forall [<project>…] –c <command>

迭代器,能夠在全部指定的項目中執行同一個shell指令

  • -c:後面所帶的參數着是shell指令
  • -p:在shell指令輸出以前列出項目名稱
  • -v:列出執行shell指令輸出的錯誤信息

additional environment variables:

  • REPO_PROJECT:指定項目的名稱
  • REPO_PATH:指定項目在工做區的相對路徑
  • REPO_REMOTE:指定項目遠程倉庫的名稱
  • REPO_LREV:指定項目最後一次提交服務器倉庫對應的哈希值
  • REPO_RREV:指定項目在克隆時的指定分支,manifest裏的revision屬性

另外,若是-c後面所帶的shell指令中有上述環境變量,則須要用單引號把shell指令括起來。

添加的環境變量

repo forall –c ‘echo $REPO_PROJECT’
repo forall –c ‘echo $REPO_PATH’

merge(合併多個分支)

把全部項目多切換到master分支,執行如下指令將topic分支合併到master分支

repo forall –p –c git merge topic

tag(打標籤)

在全部項目下打標籤

repo forall –c git tag crane-stable-1.6

remote (設置遠程倉庫)

引用環境變量REPO_PROJECT添加遠程倉庫:

repo forall –c ‘git remote add korg ssh://xiong@172.16.31/$REPO_PROJECT.git’

刪除遠程倉庫:

repo forall –c git remote add korg

branch(建立特性分支)

repo forall –c git branch crane-dev
repo forall –c git checkout –b crane-dev

repo grep

至關於對git grep 的封裝,用於在項目文件中進行內容查找

repo manifest

顯示manifest文件內容

repo manifest –o android.xml

repo version

顯示repo的版本號

repo upload

repo upload至關於git push,可是又有很大的不一樣。它不是將版本庫改動推送到克隆時的遠程服務器,而是推送到代碼審覈服務器(Gerrit軟件架設)的特殊引用上,使用SSH協議。代碼審覈服務器會對推送的提交進行特殊處理,將新的提交顯示爲一個待審覈的修改集,並進入代碼審查流程,只有當審覈經過後,纔會合併到官方正式的版本庫中。

repo upload [--re --cc] {[<project>]… | --replace <project>}
  • -h, --help:顯示幫助信息
  • -t:發送本地分支名稱到Gerrit代碼審覈服務器
  • --replace:發送此分支的更新補丁集
  • --re=REVIEWERS:要求指定的人員進行審覈
  • --cc=CC:同時發送通知到以下郵件地址

repo download

主要用於代碼審覈者下載和評估貢獻者提交的修訂

repo download {project change [patchset]}…

repo selfupdate

用於repo自身的更新

參考文檔

相關文章
相關標籤/搜索