「Gitに乗り換えたい！githubを導入したい！....でもうちはsubversion使ってるし、github高すぎるよ」な人のための最強の妥協案を考えた

どうも、「Gitに乗り換えたい！githubを導入したい！....でもうちはsubversion使ってるし、github高すぎるよ」な人のわたしです。

最近はプライベートではgit + githubしか使ってないです。git + githubの味を覚えたらsubversionでの開発にストレスがたまってきました。どうしてもgit + githubが使いたいという衝動が抑えられません。

なので今回はgit + githubでの開発の代替として編み出した
**subversion + git + git-svn + review-board** の導入方法を紹介します。

まず対象となるのは、以下の条件に当てはまる方です。

- subversionをマスターリポジトリとして開発している
- gitやgithubの導入を熱望してるけども大人の事情で叶わない
- コードレビューはしていない、もしくはしているけども効率が悪い

これに当てはまらない恵まれた方々はおそらくこれを読んでも得られるものがないと思うのでさようなら。。。

# 目標

まず本題に入る前にgit + githubを導入することで
得たいメリットを挙げてみます。

①ローカルでこまめにコミットできる安心感
②機能ごとや差込の作業など並行してこまめにbranchがきれるので複数プロジェクトの開発を行いやすい
③頭の良いマージ
④プルリでソースレビュー(レビューする/される人の時間的非同期関係)
⑤GUIでソースコードを細かくレビューできる

これは個人的な見解なので人によっては
求めるものが違うかもしれませんが現時点の私の開発に関しては
これだけできれば十分です。

これらのメリットを享受するために以下の環境を作っていきます。

- ローカルリポジトリ:git
- リモートリポジトリ:subversion(既存)
- レビューツール:ReviewBoard
- ローカル/リモート連携:git-svn
- OS:CentOS5.x

# git-svnの導入

まずはリモートのリポジトリがsvn環境でgitを使えるようにしましょう。

これができるようになると先ほど挙げた①②③を満たすことができます。

まずはインストール～既存svnリポジトリのgit化(ローカル)まで。

## まずはインストール
svnはすでにインストールされているものとします。

    $vim /etc/yum.repos.d/rpmforge.repo
    [rpmforge]
    name = Red Hat Enterprise $releasever - RPMforge.net - dag
    mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge
    enabled = 0
    gpgcheck = 0

    $yum install git git-svn --enablerepo=rpmforge
    $git svn --version //確認
    git-svn version 1.7.11.3 (svn 1.6.11)

## 既存svnリポジトリをgit化(ローカル)する
    $mkdir 作業ディレクトリ
    $cd 作業ディレクトリ
    $git init
    $git svn clone -s --prefix svn/ [svnリポジトリ（trunkはつけない）] [clone後ディレクトリ名]
    $cd cloneしたディレクトリ
    $git svn show-ignore >> .git/info/exclude //これで既存のsvnで管理除外していた情報がincludeされます

これでOK。あとはほぼすべてのgitコマンドを使って開発できます。

## 基本開発フロー
    $git checkout -b topic-branch名
    $git add .
    $git commit -m "コメント"

#### もしsvnのリモートリポジトリtrunkから更新内容を取り込みたいなら
     $git svn rebase

もしくは

    $git svn fetch
    $git checkout trunk //確認
    $git checkout master
    $git merge trunk

#### リモートリポジトリに変更を反映したい場合
    $git checkout master
    $git merge topic-branch名 
    $git svn dcommit
    // もしもコミットログがたくさんある場合はgit merge --squash topic-branch名として
    //コミットを１つにまとめてからgit svn dcommitしたほうが綺麗

#### もしtopicブランチを削除したいなら
    $git branch -d topic-branch名

このように完璧にgitと同じというわけではありませんが
svn環境下でgit風に開発するには十分ではないでしょうか。


# Review Boardの導入

git-svnを導入することで①②③の目標は達成できましたが、まだ
④プルリでソースレビュー(レビューする/される人の時間的非同期関係)
⑤GUIでソースコードを細かくレビューできる
を達成できていません。

そこで次に④⑤を達成するべくReviewBoardの導入を行いましょう。

## Review Boardとは
まずReviewBoardとは何かといいますと

- プレコミットレビュー
- Webでレビューを管理
- レビュー依頼ツールの提供
- 多彩なバージョン管理システムに対応
- オープンソースソフトウェア

(引用:http://www.atmarkit.co.jp/ait/articles/1101/13/news113.html)

これらの機能を兼ね備えたレビュープロセス改善ツールです。
過去にはTwitterやVMwareも利用していた実績があります。

このReviewBoardではさまざまなバージョン管理システムを利用でき、
もちろんsvn,gitも利用可能です。

オープンソースである点も魅力的です。

Review Boardを使うことができれば、④のプルリっぽいことができるし、⑤も達成できそうです。

## インストール～post-reviewまで
とても便利なReview Boardですがインストールは
割と面倒です。

申し訳ないですがPythonのインストールからmysql,apacheと色々煩雑になってしまうのでここでは
詳しい手順は割愛させていただきます。
ただ、以下のリンクの通りにインストールしていくと
なんとかなりますのでご参照ください。
また、ユーザー作成も以下リンク通りに行ってください。

[Review Boardの導入手順](http://www.sdmemo.com/wiki/Review_Board%E3%81%AE%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86)


ユーザー登録までできたら、次はリポジトリの登録を行いましょう。
リポジトリ登録は管理画面のadminからadminユーザーで行います。
管理画面に入ったら、「リポジトリ」に入り、各々の管理しているsvnリポジトリのURLを登録しましょう。
![8ca938f6af5d4c2a7c41a9ce9eee3993.png](https://qiita-image-store.s3.amazonaws.com/0/13609/a2102ecb-eeb5-3d9c-d77a-8159b92d28c5.png)


ここまできたらあとはreview申請をだすのみ。
ReviewBoardではpost-reviewという独自のWEB APIを利用してreview申請を出します。
以下のような感じです。

    [razokulover@test test-app]$post-review

もしくは

    [razokulover@test test-app]$post-review レビューをしてほしいfile

のようにコマンドをたたきます。

## git-svnとReviewBoardの連携

ReviewBoardの設定が終われば
ツールの準備はすべて終わりです。

最後に以下を設定すればpost-reviewができるようになると思います。

    [razokulover@test test-app]$vim .git/config
    [reviewboard]
        url = review-boardのURLルート
    [razokulover@test test-app]$ post-review
    ==> HTTP Authentication Required
    Enter authorization information for "Web API" at review-board.com
    Username: razokulover
    Password:
    Review request #1 posted.

    http://review-board.com/r/1/

## まとめ

以上がgit+githubをあきらめきれない人の最強の妥協案でした。

この環境で開発すれば、以下のメリットがすべて享受できます。

①ローカルでこまめにコミットできる安心感
②機能ごとや差込の作業など並行してこまめにbranchがきれるので複数プロジェクトの開発を行いやすい
③頭の良いマージ
④プルリでソースレビュー(レビューする/される人の時間的非同期関係)
⑤GUIでソースコードを細かくレビューできる（品質アップ）

git + githubで得たかったものがすごい回り道ながら手にいれることができました。

「他にもっといい方法あるよ」とか「こんな妥協案もあるよ」というのがあれば教えていただけるとありがたいです。

(参考リンク)

- [git svn 使い方](http://transitive.info/article/git/command/svn/)
- [git-svnを使うときのベストプラクティス](http://layzie.hatenablog.com/entry/20121216/1355653349)
- [Review Boardの導入手順](http://www.sdmemo.com/wiki/Review_Board%E3%81%AE%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86)
- [post-review, git-svn and Review Board](http://www.g9labs.com/2010/06/02/post-review-git-svn-and-review-board/)
- [Review Boardならコードレビューを効率良くできる！ (1/3)](http://www.atmarkit.co.jp/ait/articles/1101/13/news113.html)