天天看點

建立自己的Repo Server

     非常久曾經出于好奇細緻了解了下Repo及server的原理,可是今天突然發現有些忘了。于是想記錄下來。

Repo機制

    Repo是google官方為管理Android項目開發出來的一個軟體。

我們先來看下官方對該軟體的描寫叙述。

Repo is a tool thatwe built on top of Git. Repo helps us manage the many Git repositories, doesthe uploads to our revision control system, and automates parts of the Androiddevelopment workflow. Repo is not meant to replace Git, only to make it easierto work with Git in the context of Android. The repo command is an executablePython script that you can put anywhere in your path

    從上面能夠看出,repo本身并不負責項目的管理(記錄項目的更新,回退更新等)。它僅僅是一個基于git之上的工具,用來管理多個git項目的便捷工具。它是用python實作。

      我們知道Android裡面的各個子產品是用git來管理的,Android裡有大量的這樣的子產品,多達200多個。假設使用者一個一個的使用git pull/fetch去更新每一個git項目,那任務量太大了,同一時候使用者還必須知道每一個git相應的branch資訊。Repo工具就為解決問題的,它借助一個manifest.git項目列出了全部被管理的git的資訊,包含檔案夾結構,branch。擷取位址等等。

Repo幹了什麼事

        我們運作repo時通常是使用例如以下指令:

       repo init –u /media/itleaks/git/repositories/platform/manifest.git

       -u 後面的參數是重點。當使用者運作這條指令後,repo工具相當于運作了

mkdir .repo
cd .repo
git clone /media/itleaks/git/repositories/platform/manifest.git      

       我們來看下一個android repo項目的manifest.git的内容:

itleaks@Itleaks:/media/itleaks/source/4.4$ cat .repo/manifests/.git/config |more
[core]
  repositoryformatversion = 0
  filemode = true
[remote "origin"]
  url = /media/itleaks/git/repositories/platform/manifest.git
  fetch = +refs/heads/*:refs/remotes/origin/*
[repo]
  reference = /media/itleaks/git/mirror/android.googlesource.com/
[branch "default"]
  remote = origin
  merge = master

itleaks@Itleaks:/media/itleaks/source/4.4$ cat .repo/manifests/default.xml |more
<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  //能夠定義多個remote
  <remote  name="aosp"
           review="review.source.android.com"
           //這個就是擷取git的server位址,這裡是一個相對檔案夾..
           //剛剛我們提到過,manifests本身也是一個git項目,它自然就有位址
           //這個..指出以下的全部git項目的根檔案夾在manifests項目檔案夾的上層檔案夾,即
           //  /media/itleaks/git/repositories/
           fetch=".." />
  //預設的remote就是上面的aosp
  <default revision="refs/tags/android-4.4_r1"
           remote="aosp"
           sync-j="4" />
  //項目路徑,項目名稱
  //這個描寫叙述運作後,相當于使用者運作例如以下兩條指令
  // cd ROOTDIR/art
  // git clone /media/itleaks/git/repositories/platform/platform/art
  <project path="art" name="platform/art" />
  <project path="bionic" name="platform/bionic" groups="pdk" />
  <project path="bootable/bootloader/legacy" name="platform/bootable/bootloader/legacy" />
  <project path="bootable/diskinstaller" name="platform/bootable/diskinstaller" />
  <project path="bootable/recovery" name="platform/bootable/recovery" groups="pdk" />
  <project path="cts" name="platform/cts" groups="cts" />
  <project path="dalvik" name="platform/dalvik" />      

        然後使用者運作repo sync後才開始真正依照上面描寫叙述的規則下載下傳全部代碼項目。即循環運作git clone /media/itleaks/git/repositories/platform/xx

建立repo server

 從零開始建立reposerver

        從上能夠看出,建立repo server的核心是建立manifest.git項目。

//建立檔案夾
mkdir /tmp/git/repositories/platform -p
cd /tmp/git/repositories/platform
//建立測試git test
mkdir test;git init;touch 1.txt;git add .;git commit –asm “initial version”
//建立測試git test1
mkdir test1;git init;touch 2.txt;git add .;git commit –asm “initial version”
//建立manifest git
mkdir manifest;git init;touch default.xml;git add .;git commit –asm “initial version”
然後改動default.xml,輸入例如以下資訊
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="test "
           fetch="."
           review="https://android-review.googlesource.com/" />
  <default revision="master"
           remote="test"
           sync-j="4" />

  <project path="test" name="test"/>
  <project path="test1" name="test1" /> 
</manifest>
這樣就建好。送出
git commit –asm “add real content”      

        運作完上面的操作後。我們就能夠使用這個repo server了

        本地使用者僅僅需運作:repo –u /tmp/git/repositories/platform/manifest就可下載下傳這個reposerver的項目代碼。

         遠端機器通過:repo –u ssh:ip:/tmp/git/repositories/platform/manifest

優化repo server資料内容

         上面的方法有一個非常不好的就是這個server下的每一個git項目是有備援資訊的。

由于reposerver裡是不須要直接操作git項目裡的内容的,往往是repo client改動代碼後送出上去來改動server的資料。是以git提供了一個—bare參數來優化git server的資料。即git server端全部内容以二進制管理。是以上面的repo server的生成應該是這樣。

以test git 為例:

以下的指令

cd /tmp/git/repositories/platform;mkdir test;gitinit;touch 1.txt;git add .;
    git commit –asm “initial version”      

需改為:

//建立client git
     cd /tmp;mkdir test;git init;touch 1.txt;git add .;gitcommit –asm “initial version”
//建立server git
     cd/tmp/git/repositories/platform;git clone /tmp/test –bare;      

       這樣在server檔案夾/tmp/git/repositories/platform下的全部git的資料都是優化過的。

利用已有repo建立自己的repo server

       這個方式是非常實用的,比方一家公司進行android項目開發。首先肯定是須要下載下傳aosp的base code,然後在上面進行一些改動。公司在内部建立一個repo sever,其它全部的員工直接從公司的這個repo server下載下傳代碼。而不是從google官方下載下傳。這首先是提高了下載下傳速度,本地區域網路下載下傳肯定比遠端下載下傳快。

        其實,不論什麼一個已有的repo經過簡單改動都能夠變為一個reposerver.比方假設一使用者通過運作以下的指令完畢了android的下載下傳。

cd  /media/ Itleaks /source/4.4
repo init –u /media/itleaks/git/repositories/platform/manifest.git
repo sync      

       然後他僅僅需在根檔案夾下建立一個manifest項目。而且複制檔案.repo/manifest/default.xml并改動就可以将這個repo項目變為reposerver。

利用repo mirror建立自己的repo server

      事實上repo提供一個更加好的參數用來建立repo server,即repo –mirror. 比方你想要建立一個android的repo server,僅僅需運作例如以下指令就可以:

repo init –u /media/itleaks/git/repositories/platform/manifest.git –mirror
repo sync