Subversionのロック機構

Subversionでバイナリ差分がとれる、これでバイナリファイルも遠慮なくバージョン管理できる、と書いたわけだが、そのために必須となる機構がある。ロックである。

ロックは、MicrosoftのVisual Source Safeなどが採用している機構で、編集中のファイルを他の人間が一切触れないようにするものである。ひとつのファイルを複数人で同時に扱うと、あちこちで不整合が起きてしまいそうなので、絶対に同時に一人しか編集できないこの方式は一見利にかなっている。

しかし、CVSSubversionは基本的にロックを使わない。メソッドAを編集したいだけなのに、なぜまったく関係ないメソッドZの編集を他人が完了させるのを待たねばならないのか?そんなのは時間の無駄である、というポリシーなのである。同じファイルでも別々の箇所を編集したいだけであれば、複数人で同時に編集して、最後にマージするほうが早い。マージも大抵の場合システム側で勝手に処理してくれる。たまたま編集箇所が重なってシステムがマージできないとしても(これを衝突-conflictという)、その旨の報告はしてくるので、これに応じて人がちょっと手を入れてやればよい。オープンソースコミュニティは皆こちらの方式でソース管理を行っているし、俺もCVSSubversionを使う以上、こちらのスタイルである。

ところが、非ロック機構は、ファイルをマージできる、という前提があるからこそ成り立つ。マージできるファイルというのは、行単位で差分を取れるファイル、つまるところテキスト形式のファイルである。ところが、MS Officeで書かれた設計書や、画像ファイル、音声ファイルなどといったバイナリ形式のファイルは、通常マージすることができない。よって、これらを扱うときには例外的にロックが必要である。

そういう声がやはり上がったらしく、Subversionでは1.2.0からロック機構が追加されている。このロック機構の優れている点は、他人がロックを横取り(steal)できる、というところである。

他人が自由に解除できるなら、それはロックとは呼べないだろう、という考え方もある。しかし、ロックする際にコメントを書けるので、他の人間はそのファイルがロックされている理由を知ることができる。よって、普通はロックをかけた人間に断り無く勝手に横取りしたりはしないし、そんなことをする人間がいるならば、それはプロジェクト内部の人間系の問題であり、システムが関与することではない。そして、ありがちな問題、「あのやろう、ロックかけたまま帰りやがった!でも今すぐこのファイルを編集しなければならない!」という事態に陥ったときは、緊急対処的にロックを外して問題解決できるのである。つまり、Subversionのロックは、あくまで意思表示手段でしかない。だが、そのおかげで非常に柔軟に運用できるのだ。

また、ファイルごとにロックしなければ編集できないように属性を設定することもできるので、編集し終わってからロックが必要なことに気づき、時間を無駄にする、といった危険も回避できる。なかなかどうしてかゆいところに手が届く実装ではないか。