Vanished Garden

SubGitを使ってみた

今の会社では、開発の傍らで開発支援系サービスの管理をだいたい担ってるのだけど、その中でSubversionとGitの同期をしてくれる SubGit を使ってみたよ、というお話。

ただし、SubGitは最近2.0がリリースされたけど使ってるのは一つ前の1.0.3なのでビミョーに違うのは勘弁して欲しい。

経緯

今のプロジェクトはソースコードを基本的にはSubversionで管理している。
一部プロジェクトではGerritを使ってて、今のプロジェクトも移行したいねーって話してたけど、
ソースファイルのコピーを避ける目的でsvn:remoteとか多用しててどうしたものかという感じでそのまま。

svn:remoteの良い解決方法があれば教えてください。

それはさておき、リポジトリのサブセットを公開してお互いの更新を受け取りたいという要件があったので、いくつか検討した結果SubGitだと良い感じじゃない、ということで導入した。

ナニソレ

SubGitがどういうものか簡単に説明すると、SubversionとGitのリポジトリそれぞれにHookを仕込んで、コミットやプッシュをトリガに他方へと反映するツールという感じ。 Subversionの1リポジトリから複数のGitリポジトリを作成することもでき、それぞれでtrunkやbranch、tagといった場所のマッピングやユーザーのマッピングもできる。 動作にはJavaが必要。

以前取ったライセンスキーでは10リポジトリまで、1リポジトリ辺り10人までだったけど、2.0から1サーバー全体で10人の様だ。 とりあえず今のところはセーフだけど、11~25人は1600EUROとのことなので人数が増えたら諦めざるをえない。
あと、他のプロジェクトでも使いたいって言われたら2.0には移行できないなー。

インストール

インストールはSubversionのリポジトリに対して行う。
Git → Subversion方向でのインストールも可能なようだけど、試したことがないので省略。

# subgit configure /path/to/svn/repos

上記コマンドで、 /path/to/svn/repos/conf/subgit.conf が出来るので、設定を行う。
shelvesという特別なブランチが要求されるので、適宜作成しておく必要がある。
shelvesはGitからSubversionにpushを反映する際に、git側でのコミット群を再現したりといった用途に使われる様だ。
最終的にはshelvesの内容がtrunkなどにマージされる。

リビジョンが進んでるリポジトリだと生成に時間がかかって仕方ないので、minimalRevision とかで制限しておくと良さげ。

設定が終わったらSubversionのリポジトリからGitのリポジトリを生成して完了。
ただ、rootで実行するとパーミッション周りで問題が起きがちなので適宜chownとかが必要。
sudo -u apache とかで実行した方が楽かも。

# subgit install /path/to/svn/repos

あとはどちらにコミット/プッシュしても他方から取得できる。 スバラシイ。

トラブルとか

今のところ遭遇したトラブルは下記のような感じ。

  • Javaをバージョンアップした時には忘れずに subgit install でHookに含まれるJavaのpathを更新しておかないとエラーになる。
  • 何らかの都合でGitリポジトリが同期するSubversionリポジトリの場所を変えた場合、 Gitリポジトリを消してから subgit uninstall → subgit install で作り直して、各人のクローンは一旦破棄(たぶんgit reset –hard remote/masterとかでも大丈夫)してもらうのが良さげ。
    作り直したGitリポジトリをそのままpullした後でコミットしたらshelvesに過去のコミットが大量に再現されて泣いた。
  • subgit install –rebuild も同様にクローンの破棄が必要。
総括

用途は限られると思うけど、とても便利だとおもうよ!

Tagged on: , , ,

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.