SVNのブランチは貧弱なのか

もう8月ですね。暑いですね。W杯はスペインの優勝で幕を閉じました。

僕は7月からやばそうなプロジェクトに入りました。僕の7月の残業時間は60ですが、100オーバーの人も少なくないようです。夜中の11時過ぎても人がいっぱいいるのはやっぱ変ですよね。
来年の3月まで続くのにこの状況です。自分も含めて心身壊す人が出ないことを祈ります。

さてそんな状況ではありますが、興味深いエントリがありました。

分散型バージョン管理システムは実際の開発現場でどれだけ普及するか? - 現場のためのソフトウェア開発プロセス - たかのり日記

エントリの内容には割と同意です。

僕自身も含めてですが、いままで見てきた感じでいうとSVNを使いこなしてかつ構成管理を意識できる開発者は多くないのが現実です。

ありがちなのはこんな感じ。

  • コミット漏れによるコンパイルエラー
  • 他の人の変更内容を誤って上書き
  • 自分が作業しているEclipseのプロジェクトのSVN更新はしても、参照しているプロジェクトをSVN更新していないのでAPI変更に気づかずコンパイルエラー(これはコミュニケーションの問題かも)
  • ブランチ切ったのはいいもののマージが手動
  • 間違ってトランクを全削除
  • トランク直下に意味不明のファイルをコミット
  • よくわからんロックしてる
  • コミットコメントが空

ミスった場合もすぐ直せばいいとは思うんですが、そうはなかなかならないw

なのでSVNのアクセス権を設定して指定したディレクトリ以下しかコミットできないようにしたり、指針を展開したりするわけです。

まあ僕自身もてんぱってるときはコミットコメントがてきとーだったりします。すんません。バグ修正だったら書きやすいんですけどね。

そんな状況なのでSVNより敷居が高いと思われるGitやMercurialのようなDVCSの導入には二の足を踏んでしまいます。

小規模新規開発で少数精鋭ならやろうかなと思う程度です。受託じゃなくて製品開発のほうがいいかな。受託でブランチってそんなに使わなそうだし。

というようなことを思っているわけですが、それよりもエントリに対するkoichkさんのコメントが興味深いです。

SVN の問題は,ワーキングコピー〜リポジトリ間の操作とブランチ間の操作が全然別で,ブランチ間の操作は低水準で貧弱 (リビジョン番号指定とかあり得ない!) なこと.一つのリポジトリ (トランク) に少数の開発者がいてうまくやれることを,ブランチ間に適用できない.だからスケールしない.
分散 VCS の場合は SVN でいうワーキングコピーも (ローカル) リポジトリで,リポジトリ (あるいはブランチ) 間も SVN のワーキングコピー〜リポジトリ間と同じように高水準の操作ができる.ClearCase は集中型の VCS だけど,ワーキングコピーとブランチを 1 対 1 で使い,ブランチ間で高水準の操作ができる.

これを読んでSVNのブランチが貧弱だと言われる理由が少しわかった気がします。いままであんまぴんとこなかったんですよね。DVCSあんま使ったことないからかどこがどう貧弱なんだと。

SVNでは内部的にはブランチという概念はなくそれはフォルダーのコピーです。ブランチの作り方がsvn branchではなくsvn copyなのがそれを示しています。

ブランチにはリリースブランチ、トピックブランチ、ベンダーブランチの3種類あります。

SVNでトピックブランチを作って作業する場合は以下のような流れになります。たぶん。

  • svn copyでトランクからコピーしてブランチ作成
  • svn switchかブランチからチェックアウトして開発者はブランチで作業してコミット
  • トランクの成果をブランチにマージ(svn merge)
  • ブランチで作業が終わったらトランクにマージ(svn merge --reintegrate)
  • 動作に問題無いか確認してトランクにコミット

Gitだとたぶんこんな感じ。最初にgit cloneはしとく。

  • git branchでブランチ作成
  • git checkoutでブランチに移動して作業
  • masterの成果を持ってくる(git checkout master, git pull)。ただしブランチにmasterの成果はマージしない。
  • ブランチの成果をmasterにマージ(場合によってはrebaseしてからマージ)
  • 動作に問題無いか確認してpush

コマンド数はあんま変わらないかも。

ただGitの場合はSVNと違って内部的にもブランチの概念があり、ブランチ作業がスムーズです。性能もいい。

SVNで100個のブランチ作るのとGitのローカルリポジトリで100個のブランチ作るのでは意味が違います。ローカルでブランチ作って作業している分には問題無い。ああ、これ大きいかも。

ただSVNはフォルダでブランチを表現しているため操作性はチープかもしれないけど直感的にはわかりやすいと思います。Subclipseリポジトリエクスプローラが好きなのはそのせいだな。たぶん。

でもGitだと話は異なるのでEGitがSubversiveに似ているのはいいと思う。

こんな感じ。

なんかまとまってないけど脳内を吐き出してみますたw でもSubversion 1.7になったら話は変わるかも。