git-svn を使って、Subversion のリポジトリと連携
ちょっと前に エレコマ という EC サイト構築パッケージを利用して、ショッピングサイトを作ることになったのですが、エレコマのリポジトリが Subversion でした。
私のいるプロジェクトで使おうと決めたバージョン管理システムは Git だったので、Subversion リポジトリと連携できる git-svn というコマンドを使ってソースを取得することにしました。
下記の環境で行います。
- 共有リポジトリ(bare なリポジトリ)と、最新ソース取得用リポジトリ
- ローカルリポジトリ
- OS は WindowsXP(クライアントPC)
- git は msysGit で、バージョンは 1.6.5.1.1367.gcd48
共有リポジトリの作成と、sourceforge から エレコマのソースを取得
hoge サーバ上に開発用の共有リポジトリ(bare なリポジトリ)と、エレコマの最新ソースを取得してマージするためのリポジトリそれぞれ作成します。
リポジトリの役割はまとめるとこんな感じです。
- /var/git/elecoma.git : 開発用リポジトリ
- /var/git/elecoma : git-svn コマンドで、sourceforge からソースを取得するリポジトリ
[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 します。
- 共有リポジトリから 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 に移行する手順を書こうと思います。