git-svn を使って、Subversion のリポジトリと連携

ちょっと前に エレコマ という EC サイト構築パッケージを利用して、ショッピングサイトを作ることになったのですが、エレコマのリポジトリSubversion でした。
私のいるプロジェクトで使おうと決めたバージョン管理システムは Git だったので、Subversion リポジトリと連携できる git-svn というコマンドを使ってソースを取得することにしました。

下記の環境で行います。

共有リポジトリの作成と、sourceforge から エレコマのソースを取得

hoge サーバ上に開発用の共有リポジトリ(bare なリポジトリ)と、エレコマの最新ソースを取得してマージするためのリポジトリそれぞれ作成します。
リポジトリの役割はまとめるとこんな感じです。

[root@hoge ~]# cd /var/git
# sourceforge にあるリポジトリから、trunk のみ取得するよう指定
# 自動的に elecoma というディレクトリ名で取得される
[root@hoge git]# git svn clone --prefix svn/ --trunk trunk -s http://svn.sourceforge.jp/svnroot/elecoma/
# 共有リポジトリを作成
[root@hoge git]# git init --bare elecoma.git
# 共有リポジトリの master ブランチに sourceforge から取得したソースを push
[root@hoge git]# cd elecoma
[root@hoge elecoma]# git push /var/git/elecoma.git master

開発用ブランチの作成

リポジトリには master の他に dev というブランチを作成することにします。私たちのプロジェクトで行う開発は dev ブランチで作業し、master ブランチについては 手を加えていないエレコマのソース、というように使い分けます。

# 共有リポジトリに移動して、dev ブランチを作成
[root@hoge elecoma]# cd ../elecoma.git
[root@hoge elecoma.git]# git branch dev
# elecoma リポジトリにも dev ブランチを作成し、dev ブランチにいるときは必ず dev へ push するよう設定
[root@hoge elecoma.git]# cd ../elecoma
[root@hoge elecoma]# git checkout --track origin/dev

エレコマの最新ソースを取得してマージするスクリプトを作成

エレコマは結構頻繁にアップデートされているので、sourceforge から最新のソースを取得して、開発中のソースとマージするスクリプトを作成しました。cron で毎日 0:00 に動くように設定します。
Subversion から git-svn で更新されたソースを取得するには、git svn rebase を使います。
ちなみに、バッチは勢いで書いたので、ログの出力内容とかいろいろひどいです。一応動きますが、コピーはオススメしません。

  • バッチ : /var/git/elecoma/tmp/update/update_elecoma.sh
#!/bin/sh
ROOT=/var/git
ELECOMA_REPO=$ROOT/elecoma.git
ELECOMA=$ROOT/elecoma
UPDATE=$ELECOMA/tmp/update
LOG=$UPDATE/logs

cd $ELECOMA
# 共有リポジトリの最新を取得
git pull $ELECOMA_REPO dev

# http://svn.sourceforge.jp/svnroot/elecoma/ から最新のソースを取得
git checkout master
git svn rebase
git push $ELECOMA_REPO master
git checkout dev
git merge master

if [ $? -eq 0 ]
then
        git push $ELECOMA_REPO dev
        if [ $? -eq 0 ]
        then
                echo 'finish'
        else
                # push に失敗した場合ログ出力
                echo "[`date +"%Y-%m-%dT%T"` #$$] INFO -- : 共有リポジトリ(elecoma.git)>への push に失敗しました。コンフリクトしている可能性があります。" >> $LOG/batch.log
                exit 1
        fi
else
        # merge に失敗した場合ログ出力
        echo "[`date +"%Y-%m-%dT%T"` #$$] INFO -- : master との merge に失敗しました。コン
フリクトしている可能性があります。" >> $LOG/batch.log
  • cron の設定方法
crontab -e
# vi でファイルを開くので、下記を記述して保存。cron のログも吐くよう設定。
PATH=/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 0 * * * /var/git/elecoma/tmp/update/update_elecoma.sh >> /var/git/elecoma/tmp/update/logs/cron.log 2>&1

ローカル環境での設定

hoge サーバに共有リポジトリを作成したので、ローカル環境で下記のようにリポジトリを clone します。

git clone ssh://yun_kichi@hoge.co.jp/var/git/elecoma.git elecoma
cd elecoma
git checkout --track origin/dev


この設定をしておけば、自分のローカルのブランチは常に dev を見るようになります。push するときも dev に push してくれるようになります。
次回は、git-svn 取得しているソースを、git に移行する手順を書こうと思います。