Subversionの属性の使い方~基本的な操作・ファイルの無視・ロック~

はじめに

ファイルにちょっとしたデータを付与しておきたいと思ったことはありませんか?たとえば、コードレビューした人の名前やファイルを管理している人の名前などです。こういった情報はファイルに直接書き込むこともできますが、できればファイルとは別に管理したいですよね。Subversionなら、「属性」という機能を使って、それを実現できます。

この記事では、属性の概要と基本的な操作、特殊な属性の使い方についてお伝えしていきます。解説の後に、チュートリアルも用意しておりますので、ぜひご自分でも実際にやってみてください。

属性とはなにか?

属性は、ファイルに付与するメタデータで、名前と値をペアにして設定することができます。名前に使用できるのはテキストのみですが、値にはテキスト以外にもバイナリを含む任意のデータ(画像や音声など)を使用できます。ファイルの内容と同じくバージョン管理されますので、属性の変更履歴の追跡もできます。なお、属性の名前の先頭には「svn:」を付けてはいけません。これはSubversionによって、特殊な属性のために予約されているためです。

属性には、ユーザーが任意で作成するオリジナルの属性とSubversionが定義している特殊な意味を持った属性の2種類があります。まずは、オリジナルの属性の付け方から学んでいきましょう。

属性の基本的な操作を覚えよう

Subversionのインストール

まだ、Subversionのインストールがお済みでない方は、下記の公式サイトから各プラットフォーム用のインストーラーをダウンロードして、インストールしておいてください。

新しいリポジトリの作成

はじめに、練習台にするリポジトリを作成しましょう。コマンドプロンプト(コンソール)から次のコマンドを使って、新しいリポジトリを作成します。事前にカレントディレクトリを、お好きな場所に移動しておいてください。ここでは、リポジトリ名を「tuto-repo」としています。

svnadmin create tuto-repo

これで練習台となる空のリポジトリができました。

作業コピーのチェックアウト

それでは次に、コミットするために作業コピーをチェックアウトしましょう。ここでは、「work」ディレクトリを新規作成して、その中にチェックアウトします。なお、パスは適宜環境に合わせて変更してください。

mkdir work
cd work
svn checkout file:///C:/Users/Test/Desktop/tuto-repo

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_01.png

まだなにもしていないので、リポジトリは空のままですね。ここに属性を設定するファイルを追加していきます。

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_02.png

属性を設定するファイルの作成とコミット

ここでは、属性をファイルに対して設定するので、対象となるファイルを作成してコミットしておきましょう。ファイル名は、「example.txt」とし、下記の内容で作成してください。

hogehoge
fugafuga

ファイルを保存したら、次のコマンドを使ってコミットします。

cd tuto-repo
svn add example.txt
svn commit -m はじめてのコミット

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_03.png

これで属性を設定するファイルが準備できました。このファイルを対象に、属性の操作をしてみましょう。

属性の追加

それでは、ファイルにオリジナルの属性を追加してみましょう。ここではコードレビューした担当者の名前を、属性として設定する例を挙げます。属性の名前を「review-by」、値を「TaroTanaka」として、次のコマンドを使って設定します。ファイルの内容と同じく、コミットの対象となるため、続けてコミットも行っておきます。

svn propset review-by TaroTanaka example.txt
svn commit -m 属性を追加しました

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_04.png

これで、属性をファイルに対して追加することができました。うまく追加されているか確認してみましょう。

設定されている属性の取得

ファイルに設定されている属性の名前と値を取得するには、2つのコマンドを使う必要があります。まずは「proplist」コマンドを使って、ファイルに設定されている属性の名前の一覧を取得します。なお、属性の名前がわかっている場合には、この手順は必要ありません。

svn proplist example.txt

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_05.png

属性の名前がわかったので、「propget」コマンドを使って、属性の値を取得します。次のコマンドを入力してください。

svn propget review-by example.txt

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_06.png

うまく取得できましたね。このように、任意のファイルに対してオリジナルの属性を設定することができます。

なお、「proplist」コマンドに「–verbose」オプションを付けることで、すべての属性の名前と値を一覧表示することも可能です。

svn proplist --verbose example.txt

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_07.png

属性の変更

既存の属性を変更するには、追加したときと同様に「propset」コマンドを使って上書きするだけです。コミットも忘れずに行いましょう。

属性の削除

既存の属性を削除するには、「propdel」コマンドを使います。次のコマンドを入力してください。続けてコミットも行います。

svn propdel review-by example.txt
svn commit -m 属性を削除しました

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_08.png

これで、属性の追加・変更・削除と基本的な操作ができるようになりましたね。次項から特殊な属性について学んでいきましょう。

属性を使って特定のファイルを無視する

Subversionを使っていると、作業コピーのディレクトリに、リポジトリには登録したくないファイルを作成することがあります。たとえば、バックアップやログファイルなどです。リポジトリに追加しなければいいだけの話なのですが、statusコマンドにリストアップされるなど、なにかと邪魔です。そういったファイルは「svn:ignore」属性を使って、無視するように設定しておきましょう。

無視するファイルの作成

それでは、先ほどリポジトリに作成した「example.txt」ファイルを、バックアップとして「example.txt.bak」というファイル名で同じディレクトリにコピーしてください。

statusコマンドでチェック

属性を設定する前と後でどのようにstatusコマンドの結果が変化するか比較するために、ここで一度statusコマンドを実行してみましょう。

svn status

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_09.png

「example.txt.bak」ファイルが、管理されていないファイルとしてリストアップされますね。それでは「svn:ignore」属性を設定して、リストアップされないようにしましょう。

svn:ignore属性の設定

特殊な属性とはいえ、svn:ignore属性を追加する方法は、先程ファイルに対して行った方法と同じです。ただし、今回はディレクトリに対して設定します。次のコマンドを入力しましょう。

svn propset svn:ignore *.bak .
svn commit -m バックアップファイルを無視します

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_10.png

これで、拡張子として「.bak」を持つファイルは無視されるようになりました。確認のために再度statusコマンドを実行してみてください。今度は何のファイルもリストされませんね。もし、複数の無視パターンを設定したい場合には、複数行のパターンを値としてまとめて指定します。

属性でファイルのロックを強制する

Subversionは、「楽観的ロック」を採用しているおかげで、複数人のユーザーが同時に同じファイルを編集できます。たとえ競合が発生したとしても、競合箇所をマージすれば解決することができます。テキストデータならそれで問題ありませんが、バイナリデータではどうでしょうか?バイナリはテキストのようにマージすることができないため、結局どちらかの変更を破棄することになってしまうでしょう。

そういった問題を解決するために、「svn:needs-lock」属性があります。この属性は、ファイルを他の人が編集できないようにロックしてからでなければ、編集できないように強制します。これにより複数人が同時に同じファイルを編集することを防げます。

svn:needs-lock属性の設定

それでは、先程のリポジトリの「example.txt」ファイルに「svn:needs-lock」属性を設定してみましょう。なお、ここでは属性の値を「true」としていますが、実際にはどんな値でもかまいません。重要なのは属性の名前だけです。

svn propset svn:needs-lock true example.txt
svn commit -m ロックを必須にしました

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_11.png

これで属性が設定できました。すると「example.txt」ファイルが読み取り専用に変更されます。まだロックをかけていないので、編集ができなくなっているのですね。それでは、ロックを取得してみましょう。

ロックの取得

ロックを取得するには、次のコマンドを使います。

svn lock example.txt -m ファイルをロックしました

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_12.png

これでロックが取得できました。再度「example.txt」ファイルを確認してみましょう。読み取り専用が解除され、編集ができるようになっていますね。誰か一人がロックを取得すると、他の人は同じファイルに対するロックを取得することができません。これなら同時にファイルが編集されることはありませんね。

ロックの解除

ロックを取得し、ファイルを編集してコミットが終わったら、忘れずにロックを解除する必要があります。それには、次のコマンドを使います。

svn unlock example.txt

/bootcamp/wp-content/themes/_btcp/images/subversion_tutorial2_13.png

これでロックが解除され「example.txt」ファイルは再び読み取り専用に戻りました。

強制的なロックの解除

もし、だれかがロックの解除を忘れて、長期休暇に入ってしまったらどうするのでしょうか?実は、Subversionのロックは誰にでも解除できるようになっているのです。方法は、先ほどの「unlock」コマンドに「–force」オプションをつけるだけです。これはあくまで緊急時に使うものなので、強制解除が日常的に発生するなら、ロックの運用方法を見直す必要があるでしょう。

まとめ

Subversionの属性の使い方がお分かりになりましたか?属性は、必須の機能ではないものの、使いこなすことができれば、Subversionをより便利なものにできます。最も頻繁に使用されるのは、特定のファイルを無視する属性でしょう。属性は、オリジナルのものを自由に設定できますので、アイディア次第でさまざまなことに活用できます。あなた独自の使い方を考えてみましょう。

参考資料


社内サーバにリモートリポジトリを作るのも一つですが、「開発にまつわる面倒事」をこの際全部、tracpath(トラックパス)に任せてみませんか?
バージョン管理サービス・プロジェクト管理サービスの「tracpath(トラックパス)」では、
ユーザー5名、リポジトリ数3つまで、永久無料で利用可能です。

さっそく実務でも使って見ましょう。
自らも開発を行う会社が作ったからこそ、開発チームの「作る情熱」を支える、やるべきことに集中出来るサービスになっています。
エンタープライズ利用が前提のASPサービスなので、セキュリティも強固です。