Showing posts with label repo. Show all posts
Showing posts with label repo. Show all posts

Sunday, May 25, 2014

How to create a local mirror repository

1. Create / update local mirror :

#!/bin/bash
MIRROR_DIR=/android-mirror
SVR=https://source.android.com
cd $MIRROR_DIR
for p in `ssh $SVR gerrit ls-projects`
do
  if [ -d "$p.git" ]; then
  echo Update ... "$p.git"
     # update existing git db
     git --git-dir "$p.git" remote prune origin
git --git-dir "$p.git" fetch
  else
mkdir -p `dirname "$p"`
echo Mirror ... ${p}.git
     # fist time init
git clone --mirror "ssh://$SVR/$p.git" "$p.git"
  fi
done

2. Repo from local mirror :

repo init -u /android-mirror/mainfest -b xxx-branch -m xxx-mainfest --reference /android-mirror
repo sync

Pro :
1. Sync data locally, so faster.
2. Local mirror can offline move to other place, able to work from home.
3. Share .git data with local mirror, save space.

Con :
1. Not sure if git push working or not.


Tuesday, February 07, 2012

在一個對網路不友善的環境中

在一個對網路不友善的環境中....(略)

repo 預設會啟動4個 sync thread, 對於我小小的3G連外頻寬是個吃重的負荷, 可以用 -j 指定要用幾個 thread 抓 :

repo sync -j 1

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 亦會產生相同的效果