ロック

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

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

ロックの3つの意味

この節をはじめ、この文書の多くの場所では、ロックロックするという語は、コミットを壊さないためにユーザー間で排他処理を行うことを指しています。しかし、Subversionではさらに2つのロックという用語が使われているため、この文書でも注意しなければならない場合があります。

2番目の意味は作業コピーのロックで、Subverionでは、もともと同じ作業コピーを扱う複数のSubversionクライアント間での破壊を防ぐためのものです。通常この意味でのロック状態になるのは、更新やコミットなどのコマンドがエラーで中断された場合です。この意味でのロックは、作業コピーに対してクリーンアップコマンドを実行すると解消できます。詳しくは「クリーンアップ」をご覧ください。

3番目の意味は、ファイルやフォルダーが他のプロセスから使用中のためにロックされている状態で、例えばWordで文書を開いているとき、ファイルはロックされTortoiseSVNからアクセスできません。

何か対処しなければならない問題が発生したとき、3種類のロックがあることを忘れがちです。この文書ではロックという用語を、文脈から明らかであるか、特に明記されていない限り、最初の意味で使用しています。

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

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

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

重要

ロックはユーザー単位ではなく、特定のユーザーと作業コピーに結び付けられています。ある作業コピーでロックを獲得すると、同じユーザーでも別な作業コピーをコミットすることはできなくなります。

例えば、 John というユーザーがオフィスのPCで作業コピーを持っていたとします。そこに彼は、ある画像ファイルの作業を開始し、そのファイルのロックを獲得したとします。オフィスを離れるとき、そのファイルをまだ終えていないので、彼はそのロックを解除しませんでした。家に帰って、 John はこちらでも作業コピーを持ち、プロジェクトの作業をもう少しすることにしました。しかし、オフィスの作業コピーでロックを獲得していたため、同じ画像ファイルを変更したりコミットしたりすることはできません。

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

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

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

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

ロックの取得

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

図4.58 ロックダイアログ

ロックダイアログ


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

プロジェクトのプロパティの TSVN:logtemplatelock を設定すると、ロック時のメッセージを記入するユーザーにメッセージのひな形を提供することができます。プロパティを設定する方法は、 「プロジェクト設定」 を参照してください。

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

ロックの解除

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

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

ロック状態のチェック

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

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


誰がロックをかけているかを確認するのに、TortoiseSVN変更をチェック... を使用できます。ローカルに保持したロックの印はすぐに現れます。他の人が保持しているロックをチェックするには(そして誰がロックを強制解除したり横取りしたりしたかを見るには)、リポジトリをチェック をクリックしてください。

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

ロックの強制解除・横取りは避ける

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

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

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

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

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

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

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

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

フックを使用すると、ロックの強制解除・横取りを禁止したり、特定の管理者のみに制限したりすることもできます。また、ロックの強制解除・横取りが発生した時に、ロックの所有者にメールを送るようにすることもできます。

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