今回はその逆 git から svn に commit できるようにしましたので、そちらを紹介したいと思います。
環境
- Git repo (github)
- SVN repo (OSDN)
- 適当な CI サービス(今回は Codeship を使用)
- アクセス用公開鍵(Codeship 発行)
手順
- git/svn ともに公開鍵を登録しておく
- svn からチェックアウト
svn co svn+ssh://path/to/trunk svn
- git からもクローンする(別フォルダ)
git clone git@github.com:srz-zumix/iutest.git git-svn
- .svn フォルダを git のフォルダにコピー、 .git フォルダを削除し、svn 作業ディレクトリにする
cp -r svn/.svn git-svn
rm -rf git-svn/.git
- cd git-svn
- 削除されたファイルを svn delete する
if `svn st | grep -q '^!'` ; then svn st | grep '^!' | awk '{print $2}' | xargs svn delete; fi
- 追加されたファイルを svn add する
svn add * --force
- svn の HEAD からログを取得し、対応する git commit id を取得する
これは svn のコミットメッセージを構築するときに使用します。
export PREVCOMMIT=
if `svn log . -l 1 | grep -q 'git@[0-9a-zA-Z]*'` ; then export PREVCOMMIT=`svn log . -l 1 | grep 'git@[0-9a-zA-Z]*' | head -1 | sed -e 's/.*git@\([0-9a-zA-Z]*\).*/\1/g'`; fi
e 's/.*git@\([0-9a-zA-Z]*\).*/\1/g'`; fi
echo $PREVCOMMIT
- git の HEAD ($CI_COMMIT_ID) からログを取得し、svn のコミットメッセージ用にファイル出力する
git log $CI_COMMIT_ID -n 1 --pretty="%B%ngit@%H%nhttps://github.com/srz-zumix/iutest/commit/%H" > ../svn.msg
- PREVCOMMIT があれば、そのコミットから HEAD までのログもコミットメッセージに追加する
if [ -n "$PREVCOMMIT" ]; then git --no-pager log $PREVCOMMIT..$CI_COMMIT_ID^ --pretty="---------------%n%B%ngit@%H%n" >> ../svn.msg; fi
- svn commit する
svn commit --file ../svn.msg
実際に動作しているところを見てもらいたいところですが、Codeship は private で見れないので割愛させて頂きます。
さて、これで github に push すると自動で svn も更新できる環境ができました。
現在 iutest v1.6.0 リリースに向けて開発中ですが、こちらの開発から git での開発に移行をしました。
バグとか typo とかあると思うので、是非是非プルリクして頂ければと思います。
では。
0 件のコメント:
コメントを投稿