ロック

Subversion は一般的に、「コピー・変更・マージ法」 で先に説明したとおり、コピー・変更・マージ 法を使用して、ロックしない方が最もよく動作します。しかし、ロックするポリシーの形で実現する必要があるかもしれません。

第一に Subversion サーバをバージョン 1.2 以降に確実にアップグレードする必要があります。それ以前のバージョンでは、ロックを全くサポートしていません。file:// アクセスを使用するなら、もちろんクライアントの方を更新する必要があります。

Subversion でロックがどのように働くか

デフォルトではロックを行わず、コミットアクセスできる人が、いつでもどのファイルでも変更をコミットすることができます。他の人は自分の作業コピーを定期的に更新し、手元に行った変更をリポジトリにマージするでしょう。

ファイルのロックを取得すると、あなたしかそのファイルをコミットできなくなります。他のユーザがコミットしようとしても、あなたがロックを解放するまでできません。ロックしたファイルは、どんな方法でもリポジトリ内の変更ができません。そのため、ロック所有者を除いて削除も名前の変更もできなくなります。

しかし他のユーザは、あなたがロックしたことを知る必要はありません。定期的にロック状態をチェックしなければ、まず他のユーザはコミットが失敗して気が付くでしょう。ほとんどこのケースでしょうがあまり便利ではありません。ロックの管理を簡単にするには、新しい Subversion の属性で svn:needs-lock があります。ファイルにこの属性が (値は何でも) セットされていると、ファイルをチェックアウトや更新すると常に手元のコピーは読み取り専用になります。ファイルにロックを取得しない限りこのままです。この動作は、まずロックを取得するまでファイルの編集ができないということを警告しています。バージョン管理下で読み取り専用のファイルは、編集前にロックする必要があることを示すように、TortoiseSVN では特別なオーバーレイアイコンでマークされます。

ロックは所有者と共に作業コピーの場所に記録されます。自宅や職場など複数の作業コピーがある場合、ロックは作業コピーの中のひとつだけに記録されます。

仕事仲間の一人がロックを取得し、解放しないまま休暇を取ってしまったら、どうしたらいいでしょう? Subversion は強制的にロックする方法を用意しています。他の誰かが持っているロックを解放することを、ロックの 破壊 と呼び、他の誰かが既にロックしているファイルを強制的にロックすることを、ロックの 横取り と呼びます。当然、仕事仲間と友人でいたいなら、軽々しく行うことではありません。

ロックはリポジトリに記録されます。また、ロックトークンは手元の作業コピーに作成されます。他の誰かがロックを破壊したりして、食い違いが発生すると、手元のロックは無効になります。リポジトリは常に決定的なリファレンスです。

ロックの取得

ロックを取得したい作業コピーのファイルを選択し、TortoiseSVNロックの取得... コマンドを選択してください。

図4.41 ロックダイアログ

ロックダイアログ


ダイアログが現れ、コメントを入力できるようになります。そのため他の人はなぜロックしたのかが判ります。コメントはオプションで、現在のところ Svnserve ベースリポジトリでしか使用できません。他の誰かからロックを横取りする場合 (のみ) 、ロックを奪う にチェックをつけてください。その後 OK をクリックしてください。

フォルダを選択して、TortoiseSVNロックを取得... を使用すると、ロックするよう選択したすべてのサブフォルダ内の すべてのファイルがある状態でロックダイアログが開きます。本当に全階層をロックするのなら、これでできます。ですが、本当に仕事仲間をプロジェクトから閉め出してしまうのなら、彼らの中の評価は非常に悪くなるでしょう。慎重に使用してください...

ロックの解除

もう必要でなくなったロックの解放を忘れないように、ロックされたファイルはコミットダイアログに表示され、デフォルトで選択されています。コミットを続けると、変更されていないとしても、選択したままのファイルのロックが解放されます。特定のファイルでロックを解放したくない場合、そのファイルのチェックを外せます (変更されていない場合)。変更したファイルのロックを保持したければ、変更をコミットする前に ロックを保持 チェックボックスを有効にしておく必要があります。

手動でロックを解放するには、ロックを解除したいファイルを作業コピーで選択し、TortoiseSVNロックを開放 コマンドを選択してください。追加で入力することはありません。そこで TortoiseSVN はリポジトリに接続し、ロックを解放します。フォルダに対してこのコマンドを使用し、再帰的に全ロックの解放を行えます。

ロック状態のチェック

図4.42 変更をチェックダイアログ

変更をチェックダイアログ


誰がロックをかけているかを確認するのに、TortoiseSVN変更をチェック... を使用できます。手元に保持したロックの印はすぐに現れます。他の人が保持しているロックをチェックするには (そして誰があなたのロックを破壊したり奪ったかを見るには)、リポジトリをチェック をクリックしてください。

ここのコンテキストメニューから、他の人が保持しているロックを、破壊したり横取りしたりするように、ロックを取得したり解放したりもできます。

ロックの破壊・横取りは避ける

ほかの誰かのロックを、断りもなく破壊・横取りすると、潜在的に作業を失う原因になります。マージ不可能なファイルの種類で作業していて、他の誰かのロックを奪った場合、自分がロックを解放すると、自由にあなたのものを上書きできます。Subversion はデータを失いませんが、ロックがもたらすはずだった、チーム作業の保護を失ってしまいます。

ロックしていないファイルを読み込み専用にするには

上記のように、ロックを使用するのに最も効果的な方法は、svn:needs-lock 属性を設定することです。属性の設定については 「プロジェクト設定」 をご覧ください。この属性を持つファイルは、ロックを取得していないと、チェックアウトや更新をしたときに常に読み込み専用になります。

TortoiseSVN は、忘れないように特別なオーバーレイアイコンで表示します。

ファイルやフォルダをリポジトリに追加した際に、自動的に属性を設定するように Subversion を設定できます。詳細情報は 「属性の自動設定」 をご覧ください。

ロックのフックスクリプト

Subversion 1.2 以降で作成したリポジトリでは、リポジトリの hooks ディレクトリに 4 つフックテンプレートが追加されています。それぞれロック取得の前後、ロック解除の前後に呼ばれます。

ファイルがロックされたときに、そのファイルを表すのに email を送信するような、post-lockpost-unlock フックスクリプトをサーバにインストールするのは名案です。そういったスクリプトが適切な場所にあると、誰かがファイルをロック・ロック解放するとユーザすべてに通知されます。リポジトリフォルダの hooks/post-lock.tmpl に、サンプルフックスクリプトがあります。

フックを利用して、ロックの破壊・横取りを禁止したり、管理者に制限したりもできます。または、ロックの破壊・横取りが発生したら、ロックの所有者に email を送りたいかもしれません。

詳細は 「サーバ側フックスクリプト」 を参照してください。