gitとsvnの自動同期スクリプトの作成!

こんにちは。研究開発部のダイケンです。

弊社(インターファクトリー)でsvnでバージョン管理してきたシステムをgitへ移行させることになりました。

しかし、ビルドやデプロイにsvn上のファイルを使用する運用がされており、すぐに完全移行するのは難しいという話になりました。このため、gitとsvnを自動同期するスクリプトを作成して、gitとsvnを並行で運用する期間を設けることにしました。

今回はその結果を記載します。

作成したスクリプト

gitとsvn同期にはgit svnコマンドを利用しました。

【参考URL】

https://git-scm.com/book/ja/v1/Git%E3%81%A8%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E9%80%A3%E6%90%BA-Git-%E3%81%A8-Subversion

git svn clone によって svn から git へリポジトリを移行し、そのリポジトリ上で双方の変更を取り込んでマージ・反映させる仕組みにしました。

作業ブランチは開発者がプッシュする master ブランチと、svn の内容を取り込む trunk ブランチを用意しました。

■git→svn : masterの内容をgit mergeして、git svn dcommitでsvnへ反映
■svn→git : svnの内容をgit svn rebaseで取り込んで、git mergeでmasterへ反映

工夫した点

fetch + reset

1点目は、競合を最小限にするためマージを極力行わないようにgit pullはfetch + resetを使用するようにしました。

ブランチ

2点目は、svnのコミットを取り込むためのブランチを作成しました。これは、git svn dcommitを行った際にgit rebaseが行われるため、コミット情報が変更されてしまい、1つのブランチで同期しようとすると上手くいかなかったためです。

なお、git rebaseが行われるのはsvnと同期済みのコミットコメントにgit-svn-idを追記するためだと思われます。

まとめ

作成のスクリプト作成中の検証でgit svnコマンドでエラーが多発し、解消させる方法を考えるのに苦労しました。

git svnコマンドの詳細な動作については調べても分からず、トライアンドエラーで想像で少しずつ理解していき、進めるしかありませんでした。

稼働当初こそ同期エラーが多く手作業での修復が必要だったものの、日が経つうちにエラーも少なくなってきました。

理由は不明ですが、おそらく開発者がgitの扱いになれて無駄なコミットやマージが少なくなったからではないかと思われます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です