한국과 미국 처럼 거리상으로 멀리 떨어져 있는 경우, 한쪽에서 source를 sync하기 위해서는 시간이 너무 많이 걸린다. Mirror를 설정하고 주기적으로 source를 sync 해 오도록 하면 시간과 load를 줄일 수 있다. 다음은 Ubuntu 10.04 LTS 기준으로한 repo mirror server 설정방법에 대해 설명한다.
1. Git daemon 설정
: xinetd를 설치하고 git-daemon을 설정한다.
$> sudo apt-get install xinetd
$>sudo vi /etc/xinetd.d/git-daemon service git { disable = no type = UNLISTED port = 9418 socket_type = stream wait = no user = nobody server = /usr/bin/git server_args = daemon --inetd --export-all --base-path=/public/gitmirrors/ log_on_failure += USERID }
$> sudo /etc/init.d/xinetd restart 혹은 $> sudo service xinetd restart
2. Mirror repository 만들기
: 외부에서 접근할 공간을 생성하고 mirror를 만든다.
$>sudo mkdir -p /public/gitmirrors/ $>chmod 777 /public/gitmirrors/ $>mkdir /public/gitmirrors/PROJECT_TOP_DIR $>cd /public/gitmirrors/PROJECT_TOP_DIR $>repo init -u ssh://USER_ID@SERVER_ADDRESS_AND_PORT/platform/manifest.git -b <BRANCH_NAME> --mirror $>repo sync
3. Fetching address 변경
: manifest.git을 변경시켜서 새로운 branch로 server에 push 한다.
먼저 manifest.git을 cloning 해오자
$> mkdir ~/temp/manifest $> cd ~/temp/manifest $> git clone /public/gitmirrors/PROJECT_TOP_DIR/platform/manifest.git
default.xml의 fetch address를 변경해서 mirror에서 받아오도록 수정한다.
<?xml version="1.0" encoding="UTF-8"?> <manifest> <remote name=REMOTE_NAME fetch="git://MIRROR_SERVER_ADDR/PROJECT_TOP_DIR" review=REVIEW_SITE_ADDR /> ...
수정된 default.xml을 새로운 branch에 push 한다.
$>git checkout -b MIRROR_BRANCH_NAME $>git add . $>git commit -m "Updated fetch URL to mirror" $>git push origin MIRROR_BRANCH_NAME
4. Client에서 mirror로 부터 source sync 하기
repo init할때 mirror branch를 명시한다.
$> repo init -u git://MIRROR_SERVER_ADDR/PROJECT_TOP_DIR/platform/manifest.git -b MIRROR_BRANCH_NAME $> repo sync
5. 주기적인 sync를 위한 crontab과 sync script 작성
$> crontab -e # m h dom mon dow command # 매시 00분 마다 repo sync를 수행 0 * * * * ~/bin/cron_repo_sync.sh
repo sync script
: 호출될 때마다 mirror directory에 있는 내용들을 본국에서 송환해 온다.
#!/bin/bash # cron repo sync script. # Syncs all mirrors under the PUBLIC_REPO_DIRS_ROOT. - skywriter PUBLIC_REPO_DIRS_ROOT="/public/gitmirrors/" REPO_PATH="/usr/local/bin/repo" sync_cmd="$REPO_PATH sync -j20" repodirs=`ls ${PUBLIC_REPO_DIRS_ROOT}` echo "start syncing" for repodir in $repodirs do echo "syncing [$repodir] at `date`" cd ${PUBLIC_REPO_DIRS_ROOT}$repodir/ $sync_cmd 2>&1 done echo "done at `date`"