Wednesday, December 07, 2011

repo -b

repo 是 google 在 Android Open Source Project 導入的原始碼管理工具,  用來同步許多 git repository 的動作, 同時也協助 source code review server 溝通。
用 repo 來開始抓遠端的 source code 時, 必須先指定 URL 及想抓取的分支, 如以下的指令就是抓出 AOSP 上 tag 為 android-4.0.1_r1 的版本 :

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

在下 repo sync 之前, 可以先看看抓下來的 manifest.xml 檔案 :

$ cat .repo/manifest.xml  | head -9
<!--?xml version="1.0" encoding="UTF-8"?-->
<manifest>

 <remote  name="aosp" <="" p="">
           fetch=".." />
 <default <="" p="" revision="refs/tags/android-4.0.1_r1">
           remote="aosp"
           sync-j="4" />

很明顯, 剛剛所下的分支版號就紀錄於此, 此時我們再下一次 init, 改抓另個分支 :

$ repo init -b android-2.3.7_r1
.repo/manifests/: manifest switched android-4.0.1_r1...android-2.3.7_r1
.repo/manifests/: discarding 10 commits removed from upstream

再看一次 manifest.xml :

$ cat .repo/manifest.xml | head -9
<!--?xml version="1.0" encoding="UTF-8"?-->
<manifest>

  <remote  name="aosp" <="" p="">
           fetch=".." />
  <default <="" p="" revision="refs/tags/android-2.3.7_r1">
           remote="aosp"
           sync-j="4" />

的確紀錄的版本改變了, manifest.xml 上面所紀錄的分支名稱, 會用來當執行 repo sync 時, 把各個 git repository 照這分支抓下來。

$ repo sync bionic
Downloading bionic: 100% (3MB/3MB), done.
...
Unpacking objects: 100% (61/61), done.
From https://android.googlesource.com/platform/bionic
...
Fetching projects: 100% (1/1), done.

$ cd bionic/
$ git branch -a
* (no branch)
...
  remotes/m/android-2.3.7_r1 -> refs/tags/android-2.3.7_r1

此時抓下來的分支, 就是後面改設的 android-2.3.7_r1, 這時試著改切回 4.0.1_r1 的分支

$ repo init -b android-4.0.1_r1
.repo/manifests/: manifest switched android-2.3.7_r1...android-4.0.1_r1
.repo/manifests/: discarding 1 commits removed from upstream

$ repo sync bionic
Fetching projects: 100% (1/1), done.

$ cd bionic/
$ git branch -a
* (no branch)
...
  remotes/m/android-2.3.7_r1 -> refs/tags/android-2.3.7_r1
  remotes/m/android-4.0.1_r1 -> refs/tags/android-4.0.1_r1

可以看到有兩個跟遠端的依從關係, 理論上這裡紀錄了 local repository 跟 remote repository 分支版本的關係, 這裡的資訊會來 commit 檔案到遠端的時候, 選擇正確的 branch, 不過這裡我尚無法實驗釐清。

當我們單獨 git clone 一個 project 時, -b 亦會產生相同的效果


No comments: