Subversionでのロック方式

Subversionに限らず、全てのバージョン管理システムには何らかの形で競合を解決する仕組みが用意されています。

ここで言う「競合」とは、複数のユーザーが同じファイルをチェックアウトして、それぞれがファイルを編集したケースにおいて、先にコミットした変更内容を後からコミットしたユーザーにより、上書きされてしまうことを示します。

例えば、AとBの二人のユーザーがいたとして、二人とも「sample.c」というファイルを編集していたとします。先にAが作業を終えて、リポジトリにコミットしました。その後、少ししてからBも作業を終えてコミットしようとしたとします。その際、単純にそのままコミットしてしまったら、Aが編集した内容が全て消えてしまうということになります。なぜなら、BはAが編集した内容をまったく知らないので、Bがコミットしたファイルには、Aが編集した内容は含まれていないからです。

このような事態を防ぐため、バージョン管理システムには以下2つのうちのいずれかの方法で上記した競合問題を解決しています。

ロック・修正・アンロック方式

ロック・修正・アンロック方式では、ファイルのチェックアウト時に、チェックアウト対象のすべてのファイルに「読み取り専用」フラグを付与します。このフラグが付けられたら、チェックアウトしたユーザー以外のユーザーは、ファイルを閲覧することやアプリケーションをビルドすることはできますが、編集や変更は行えません。つまり、チェックアウトしたファイルはロックされることになります。

ロックを解除するには、チェックアウトしたユーザーが変更作業を終えて、そのファイルをコミットすることで行えます。その後は、他のユーザーがチェックアウトすることが可能になります。

コピー・修正・マージ方式

コピー・修正・マージ方式では、ファイルのチェックアウト時に対象ファイルをロックすることはありません。ファイルは読み取り・書き込み可能な状態でチェックアウトされ、他のどのユーザーも同じファイルをチェックアウトすることが可能です。

ただし、ファイルをチェックアウトした後、自身がそのファイルを修正し、コミットするより先に別のユーザーが同じファイルをコミットしていた場合、そのファイルをそのままリポジトリにコミットすることは許可されません。

自身がコミットする際、もし別のユーザーが先にコミットしており競合が発生していた場合、バージョン管理システムが競合していることをユーザーに通知します。

競合を通知されたユーザーは、リポジトリ内の変更点と自身が持つローカルコピーの変更点をマージし、改めてコミットします。

このような過程を踏むことで、複数ユーザーの変更点がリポジトリ上に損なわれることなく残るわけです。

Subversionはコピー・修正・マージ方式

Subversionはコピー・修正・マージ方式を採用しています。ロック・修正・アンロック方式の方が単純で管理しやすく使いやすいように見えるかもしれませんが、実際はコピー・修正・マージ方式の方が円滑に進みます。というのも、ひとりのユーザーがファイルをチェックアウトしている間は、他のユーザーはそのファイルがコミットされるのをずっと待たなくてはならず、コミットされたら時点でようやく作業に取り掛かることができるようになるからです。つまり、その間、他のユーザーは作業ができないということです。同時に作業を進めて、後からマージするというコピー・修正・マージ方式のやり方は実に合理的と言えるでしょう。

実際、以前はロック・修正・アンロック方式が主流でしたが、現在はコピー・修正・マージ方式のバージョン管理システムが採用されることがほとんどです。

ただし、ファイルによっては誰かが編集している間は、そのファイルをロックして、厳格に管理したいというケースもあります。そのような場合は、Subversion1.2から導入されたオプションのファイルロック機能を使用すれば、ロック・修正・アンロック方式による管理も可能です。