Subversion は一般的に、ロックなしで、“コピー-変更-マージ” 方式を使用するのが最適です。この方式については、「コピー-変更-マージ方式」の章で先に説明しました。しかし、ロックポリシーを導入する必要がある場合もいくつかあります。
例えば、グラフィックファイルなど、“マージできない” ファイルを使用している場合です。2人が同じファイルを変更すると、マージは不可能になり、どちらかの変更が失われます。
あなたの会社では、過去に常にロック式のバージョン管理システムを使用してきており、“ロックが最善” であるという経営判断がなされている場合です。
まず、Subversion サーバーが少なくともバージョン 1.2 にアップグレードされていることを確認する必要があります。以前のバージョンは、ロックをまったくサポートしていません。 file://
アクセスを使用している場合は、クライアントのみを更新すれば済みます。
このセクション、そしてこの本のほぼ全体で、“ロック” および “ロック処理” という言葉は、コミットの衝突を避けるためのユーザー間の相互排他メカニズムを指します。残念ながら、Subversion、したがって本書が時々考慮する必要がある “ロック” には、他に2種類あります。
2つ目は、ワーキングコピーロック
です。これは、同じワーキングコピー上で動作する複数の Subversion クライアント間の衝突を防ぐために Subversion 内部で使用されます。通常、update/commit/... などのコマンドがエラーによって中断されると、これらのロックが発生します。これらのロックは、「クリーンアップ」の章で説明されているように、ワーキングコピーで cleanup コマンドを実行することで解除できます。
そして3つ目は、ファイルやフォルダが別のプロセスで使用中の場合にロックされることです。たとえば、Word で Word 文書を開いている場合、そのファイルはロックされ、TortoiseSVN からアクセスできなくなります。
これらの他の種類のロックについては、それらを気にする必要が生じるまで、基本的に忘れていても構いません。この本では、文脈から明らかであるか、明示的に述べられていない限り、“ロック” は最初の種類を意味します。
デフォルトでは、何もロックされておらず、コミットアクセス権を持つ人は誰でもいつでも任意のファイルへの変更をコミットできます。他の人は定期的にワーキングコピーを更新し、リポジトリの変更がローカルの変更とマージされます。
ファイルの ロックを取得 すると、そのファイルをコミットできるのはあなただけになります。他のすべてのユーザーによるコミットは、あなたがロックを解除するまでブロックされます。ロックされたファイルはリポジトリ内で一切変更できません。したがって、ロック所有者以外は削除または名前変更もできません。
ロックは特定のユーザーではなく、特定のユーザーとワーキングコピーに割り当てられます。あるワーキングコピーでロックを持っていると、同じユーザーが別のワーキングコピーからロックされたファイルをコミットすることもできなくなります。
例として、ユーザー Jon がオフィス PC にワーキングコピーを持っているとします。そこで彼は画像の作業を開始し、そのファイルのロックを取得します。オフィスを出るとき、彼はまだそのファイルを終えていないため、そのロックを解除しません。自宅に戻った Jon は、ワーキングコピーも持っており、プロジェクトをもう少し進めることにしました。しかし、彼は同じ画像ファイルを変更またはコミットできません。そのファイルのロックはオフィスのワーキングコピーにあるためです。
ただし、他のユーザーはあなたがロックを取得したことを必ずしも知りません。ロック状態を定期的に確認しない限り、ほとんどの場合役に立たない、コミットが失敗したときに初めてそれを知ることになります。ロックの管理を容易にするために、新しい Subversion プロパティ svn:needs-lock
があります。このプロパティがファイルに設定されている場合(任意の値)、ファイルがチェックアウトまたは更新されるたびに、ローカルコピーは読み取り専用になります。ただし、そのワーキングコピーがファイルのロックを保持している場合を除きます。これは、最初にロックを取得しない限り、そのファイルを編集すべきではないという警告として機能します。バージョン管理されており、読み取り専用のファイルは、TortoiseSVN で編集する前にロックを取得する必要があることを示す特別なオーバーレイでマークされます。
ロックは、所有者だけでなく、ワーキングコピーの場所によっても記録されます。複数のワーキングコピー(自宅、職場)がある場合、それらのワーキングコピーのいずれか1つでのみロックを保持できます。
同僚の1人がロックを取得した後、それを解除せずに休暇に出かけた場合、どうすればよいでしょうか。Subversion は、ロックを強制的に解除する手段を提供しています。他の人が保持しているロックを解除することは、ロックを解除すると呼ばれ、他の人がすでに保持しているロックを強制的に取得することは、ロックを奪うと呼ばれます。当然のことながら、同僚と仲良くしたいのであれば、これらは軽々しく行うべきことではありません。
ロックはリポジトリに記録され、ロックトークンがローカルワーキングコピーに作成されます。たとえば、他の人がロックを解除した場合など、矛盾がある場合、ローカルロックトークンは無効になります。リポジトリは常に決定的な参照元です。
ロックを取得したいワーキングコピー内のファイルを選択し、
→ コマンドを選択します。
ダイアログが表示され、コメントを入力できます。これにより、他の人があなたがファイルをロックした理由を確認できます。コメントはオプションであり、現在は Svnserve ベースのリポジトリでのみ使用されます。他の人からロックを奪う必要がある場合(および必要な場合にのみ)、ロックを奪うボックスをチェックし、 をクリックします。
プロジェクトプロパティ tsvn:logtemplatelock
を設定して、ロックメッセージとしてユーザーが入力するためのメッセージテンプレートを提供できます。プロパティの設定方法については、「プロジェクト設定」の章を参照してください。
フォルダを選択して すべてのサブフォルダ内のすべてのファイルがロック対象として選択された状態でロックダイアログが開きます。本当に階層全体をロックしたい場合は、そのように行うことができますが、プロジェクト全体から同僚を締め出すと非常に不評になる可能性があります。注意して使用してください...
→ を使用すると、不要になったロックを解除し忘れないようにするために、ロックされたファイルはコミットダイアログに表示され、デフォルトで選択されています。コミットを続行すると、選択したファイルで保持しているロックは、ファイルが変更されていなくても削除されます。特定のファイルのロックを解除したくない場合は、(変更されていない場合)それらのファイルのチェックを外すことができます。変更したファイルのロックを保持したい場合は、変更をコミットする前に ロックを保持 チェックボックスをオンにする必要があります。
ロックを手動で解除するには、ロックを解除したいワーキングコピー内のファイルを選択し、
→ コマンドを選択します。さらに入力するものは何もありません。TortoiseSVN はリポジトリに接続し、ロックを解除します。このコマンドをフォルダで使用して、すべてのロックを再帰的に解除することもできます。
自分や他の人が保持しているロックを確認するには、 → を使用できます。ローカルで保持されているロックトークンはすぐに表示されます。他の人が保持しているロックを確認する(および自分のロックが解除または奪取されたかどうかを確認する)には、 をクリックする必要があります。
ここからコンテキストメニューで、ロックの取得と解除、および他の人が保持しているロックの解除と奪取も行うことができます。
他の人のロックを知らせずに解除または奪取すると、作業が失われる可能性があります。マージできないファイルタイプで作業していて、他の人のロックを奪取した場合、ロックを解除すると、相手は自分の変更をチェックインしてあなたの変更を上書きできます。Subversion はデータを失いませんが、ロックが提供していたチームワーク保護を失いました。
前述のように、ロックを最も効果的に使用する方法は、ファイルに svn:needs-lock
プロパティを設定することです。プロパティの設定方法については、「プロジェクト設定」の章を参照してください。このプロパティが設定されたファイルは、ワーキングコピーがロックを保持していない限り、常に読み取り専用フラグが設定された状態でチェックアウトおよび更新されます。
念のため、TortoiseSVN はこれを示すために特別なオーバーレイを使用します。
すべてのファイルをロックする必要があるポリシーを運用している場合は、Subversion の自動プロパティ機能を使用して、新しいファイルを追加するたびにプロパティを自動的に設定すると簡単になる場合があります。詳細については、「自動プロパティ設定」の章をお読みください。
Subversion 1.2 以降で新しいリポジトリを作成すると、4つのフックテンプレートがリポジトリの hooks
ディレクトリに作成されます。これらは、ロックの取得前と取得後、およびロックの解除前と解除後に呼び出されます。
post-lock
および post-unlock
フックスクリプトをサーバーにインストールして、ロックされたファイルを示すメールを送信することをお勧めします。このようなスクリプトを配置すると、誰かがファイルをロック/解除した場合に、すべてのユーザーに通知できます。リポジトリフォルダにフックスクリプトの例 hooks/post-lock.tmpl
があります。
フックを使用して、ロックの解除または奪取を許可しないようにしたり、名前付き管理者に限定したりすることもできます。または、ロックが解除または奪取されたときに、所有者にメールを送信することもできます。
詳細については、「サーバーサイドフックスクリプト」の章を参照してください。