第7章 より進んだ話題

目次

実行時設定領域
設定領域のレイアウト
設定と、Windowsのレジストリ
設定オプション
属性
なぜ属性なんてものが?
属性の操作
特殊な属性
属性の自動設定
ロック
ロックの作成
ロック状況の調査
ロックの解除と横取り(steal)
ロックのコミュニケーション
ペグ・リビジョンと操作対象リビジョン
外部定義
ベンダーブランチ
一般的な、ベンダーブランチを管理する方法
svn_load_dirs.pl
ローカライゼーション
ロケールの理解
Subversion でのロケール
外部差分ツールの利用
外部 diff
外部 diff3
Subversion リポジトリの URL

もし、この本を章ごとに、最初から最後まで読んでいるのなら、 もうあなたは、ほとんどのバージョン管理操作を実行するために Subversionクライアントを使うための十分な知識を持っているはずです。 どのようにして、Subversionリポジトリから作業コピーをチェックアウト するかを理解しているはずです。svn commitsvn updateを使った変更点の送受信になじんでいる はずです。そして多分、ほとんど無意識にsvn status を実行してしまうような反射神経さえ身についているかも知れません。 どんな意図や目的に対しても、典型的な環境でSubversionを使う用意が できているはずです。

しかし、Subversionの機能セットは、「普通のバージョン管理操作」 で終わるわけではありません。

この章ではいくつかのSubversionの機能で、それほど頻繁には利用されない ようなものをとりあげます。その中で、Subversionの属性(あるいは 「メタデータ」)のサポートについて議論し、どのようにして Subversionのデフォルトの振る舞いを実行時設定領域の調整によって変更 することができるかを見ます。また、どのように外部定義を使って、 複数のリポジトリからデータを引っぱってくるようにSubversionに命令 するかを説明します。そして、Subversionのパッケージの一部である、 追加のクライアント側、サーバ側のツールのいくつかの詳細にも触れます。

この章を読む前に、Subversionで基本的なファイルとディレクトリに関する バージョン管理の能力についてなじんでいるべきです。もしまだそれについて は読んでいないか、復習が必要なら、章 2. 基本概念章 3. 同伴ツアー を読むことをお勧めします。 一度基本をマスターしてからこの章を消化すれば、あなたはもうSubversion のパワーユーザです。

実行時設定領域

Subversionはたくさんのオプションの振る舞いを用意していて、それはユーザに よって制御することができます。そのようなオプションの多くはユーザがすべての Subversion操作に適用したいと思うようなことです。それで、このようなオプション を指定するためにユーザにコマンドライン引数を思い出させるように強いるよりも また、実行しようとするすべての操作に対してそれらを使うよりも、Subversionは 定義ファイルを使います。それはSubversionの定義領域に分離されているものです。

Subversionの設定領域 は二層に分かれたオプション名と 値の階層です。普通、これは定義ファイル (最初の 層)を含む特別なディレクトリに要約してあり、それは標準的なINI形式の テキストファイルにすぎません。(そこには「sections」 があり、 それが第二層になります)これらのファイルは好きなテキストエディタを 使って簡単に編集することができます。(emacs とか vi とか) そして、クライアント によって読み出される命令を含んでいて、ユーザが好むさまざまなオプションの 振る舞いをどうするかを決定します。

設定領域のレイアウト

svnコマンドラインクライアントが最初に実行されると、 それはユーザごとの構成領域を作ります。Unix風のシステムなら、この領域は ユーザのホームディレクトリに、.subversion という名前の ディレクトリとして用意されます。Win32システムでは、Subversionは Subversionという名前のフォルダを作ります。普通には ユーザプロファイルディレクトリ(これは通常は隠れたディレクトリになりますが) のApplication Data 領域 の内部になります。しかし、このプラットフォームでは、完全な場所はシステム ごとに違っていて、本当の場所はWindowsレジストリ [28] に設定されています。 ユーザごとの設定領域は、Unix での名前である.subversion を使って参照することにします。

ユーザごとの設定領域に加えて、Subversionはシステム全体の設定領域も 理解することができます。これはシステム管理者にあるマシン上での すべてのユーザに対するデフォルトを設定する力を与えます。システム全体 の設定領域は必須のポリシーがあるわけではありません—ユーザ ごとの設定領域は、システム全体の領域を上書きし、svn プログラムに与えるコマンドライン引数は振る舞いを決める最後の場所に なります。Unix風のプラットフォームでは、システム全体の設定領域は /etc/subversion ディレクトリにあると期待されて います。Windows マシンの場合は共通アプリケーション データ 領域の内部にある Subversionディレクトリを見に行きます (このディレクトリもWindows レジストリによって指定されます)。 ユーザごとの場合と違って、svn プログラムは システム全体の設定領域を作ろうとはしません。

.subversion ディレクトリは現在のところ 三つのファイルを含んでいます—二つの設定ファイル (configserversです)、それに README.txt ファイルで、これはINI形式を 説明するものです。それらの生成時には、ファイルはSubversion がサポートするそれぞれのオプションのデフォルト値が入っており、 ほとんどがコメントアウトされていて、さらに、どのようにキーに対する 値がSubversionの振る舞いに影響するかということについて、テキストの 説明付きでグループ化されています。何かの振る舞いを変えるためには 関連する設定ファイルをテキストエディタで開き、必要なオプション値で 修正することだけが必要です。 もし設定をデフォルトに戻したい場合は、いつでも単にその設定ディレクトリを 削除し、何か無害なsvnコマンド、たとえば svn --versionのようなものを実行することができます。 新しい設定用ディレクトリがデフォルト値を含む形で生成されます。

ユーザごとの設定領域は認証データのキャッシュも含みます。auth ディレクトリは Subversionでサポートされているさまざまな認証方法で利用される キャッシュ情報の要素を含むサブディレクトリの集まりを保持します。 このディレクトリはユーザ自身だけがその内容を読むことができるような形に 作成されます。

設定と、Windowsのレジストリ

普通の INIベースの設定領域に加えて、Windowsプラットフォーム上で実行されて いるSubversionクライアントはWindowsのレジストリも設定データを格納する場所 として利用することができます。オプション名とその値は INIファイル中と同じ です。「file/section」 の階層関係も保存されます。わずかに異なる 方法によりますが—この方法では、ファイルとセクションは単にレジストリ キーのツリーの階層にしかすぎません。

Subversionはシステム全体の設定値を HKEY_LOCAL_MACHINE¥Software¥Tigris.org¥Subversionキー の元で検索します。たとえばglobal-ignores オプション、 これはconfig ファイルのmiscellany セクションにありますが、HKEY_LOCAL_MACHINE¥Software¥Tigris.org¥Subversion¥Config¥Miscellany¥global-ignoresに見つけることができます。 ユーザごとの設定値は HKEY_CURRENT_USER¥Software¥Tigris.org¥Subversion. の下に格納されるはずです。

レジストリベースの設定オプションは、ファイルベースの残りの部分を 検索する前に 検索されます。それで、 このようなオプションは、設定ファイル中で見つかった値によって上書き されます。言い換えると、設定のプライオリティは Windowsシステムの 場合、以下の順序となることが保証されています:

  1. コマンドラインオプション

  2. ユーザごとのINIファイル

  3. ユーザごとのレジストリ値

  4. システム全体のINIファイル

  5. システム全体のレジストリ値

また、Windowsレジストリは「コメントアウト」 のような概念をサポートしていません。しかし、Subversionは、 キーの名前がハッシュ文字(#) で始まるような すべてのオプションを無視します。これで実際にはSubversionのオプション を、レジストリから完全にキーを消さずにコメントアウトすることができます。 明らかに、そのオプションの設定作業は簡単にしています。

svn コマンドラインクライアントはWindowsの レジストリに書き込むことは決してありませんし、そこに デフォルトの設定値を作ろうともしません。必要なキーは REGEDITプログラムで作ることができます。他の方法 としては、.reg ファイルを作り、エクスプローラ シェルからそのファイルをダブルクリックすると、そのデータが レジストリにマージされます。

例 7.1. レジストリエントリ(.reg) ファイルの例

REGEDIT4

[HKEY_LOCAL_MACHINE¥Software¥Tigris.org¥Subversion¥Servers¥groups]

[HKEY_LOCAL_MACHINE¥Software¥Tigris.org¥Subversion¥Servers¥global]
"#http-proxy-host"=""
"#http-proxy-port"=""
"#http-proxy-username"=""
"#http-proxy-password"=""
"#http-proxy-exceptions"=""
"#http-timeout"="0"
"#http-compression"="yes"
"#neon-debug-mask"=""
"#ssl-authority-files"=""
"#ssl-trust-default-ca"=""
"#ssl-client-cert-file"=""
"#ssl-client-cert-password"=""

[HKEY_CURRENT_USER¥Software¥Tigris.org¥Subversion¥Config¥auth]
"#store-auth-creds"="no"

[HKEY_CURRENT_USER¥Software¥Tigris.org¥Subversion¥Config¥helpers]
"#editor-cmd"="notepad"
"#diff-cmd"=""
"#diff3-cmd"=""
"#diff3-has-program-arg"=""

[HKEY_CURRENT_USER¥Software¥Tigris.org¥Subversion¥Config¥miscellany]
"#global-ignores"="*.o *.lo *.la #*# .*.rej *.rej .*‾ *‾ .#* .DS_Store"
"#log-encoding"=""
"#use-commit-times"=""
"#template-root"=""
"#enable-auto-props"=""

[HKEY_CURRENT_USER¥Software¥Tigris.org¥Subversion¥Config¥tunnels]

[HKEY_CURRENT_USER¥Software¥Tigris.org¥Subversion¥Config¥auto-props]

この例は、.reg の内容を示した例ですが、その 中には、よく利用される設定オプションの大部分とそのデフォルト値が あります。システムの設定(たとえばネットワークプロキシに関するオプション) と、ユーザごとの設定(利用するエディタ、パスワード、など)の両方が あることに注意してください。さらにすべてのオプションは、コメントアウト されていることにも注意してください。オプション名の先頭のハッシュ文字 (#) を取り除くだけで、望んでいる値に設定することが できます。

設定オプション

この章では、特定の実行時オプションについて議論します。現在Subversion がサポートしているものについてです。

servers

servers ファイルはSubversionの設定オプションで、 ネットワーク層に関係したものを含んでいます。二つのセクション名がその ファイルにはあります—groupsglobal です。groupsセクションは、要するにクロスリファレンスの テーブルです。このセクションのキーは、ファイル中にある別のセクションの名前 です。その値はグロブ—ワイルドカードを含んで いるかも知れないテキストトークンです—で、Subversionの要求が送信 されるマシンのホスト名称と比較されます。

[groups]
beanie-babies = *.red-bean.com
collabnet = svn.collab.net

[beanie-babies]
…

[collabnet]
…

Subversionがネットワーク越しに利用される場合、groups セクションにあるグループ名に合うサーバ名称とマッチするものを探します。 もしマッチした場合はSubversionは次に、その名前がグループ名称とマッチした servers ファイル中のセクションを探します。そして そのセクションから実際のネットワーク設定オプションを読み出します。

global セクションはgroupsセクション のどのグロブにも当てはまらなかったすべてのサーバに対する 設定があります。このセクションで使えるオプションは、ファイルの別の サーバセクションで利用できるものとまったく同じです。(ただし、 もちろん、groups セクションは例外です) 以下のような感じです:

http-proxy-host

これは、プロキシコンピュータのホスト名称で、HTTPベースのSubversion はそこを通じて通信しなくてはなりません。デフォルトは空で、それは Subversionはプロキシを通してHTTP要求せず、直接、目的のマシンと 通信しようとすることを意味しています。

http-proxy-port

これは、利用するプロキシホストのポート番号を指定します。 デフォルトは空です。

http-proxy-username

これは、プロキシマシンで必要なユーザ名を指定します。 デフォルトは空です。

http-proxy-password

これは、プロキシマシンで必要なパスワードを指定します。 デフォルトは空です。

http-timeout

これはサーバ応答を待つ時間の最大値を秒単位で指定します。 もし、Subversionの操作がタイムアウトしてしまうような低速の ネットワーク接続に関係した問題を抱えている場合、この オプションの値を増やしてみてください。デフォルト値は 0で、この場合、HTTPライブラリである Neonにデフォルトのタイムアウト値を使うように指示します。

http-compression

これは、DAVが有効なサーバで、Subversionがネットワーク要求データを 圧縮するかどうかを指定します。デフォルト値はyes (ただし、圧縮はネットワーク層のコンパイル時に有効になっていなくては なりませんが、)です。no に設定すると圧縮は 無効になりますが、これはネットワーク転送のデバッグ時などに使います。

neon-debug-mask

これは、整数値のマスクで、HTTPライブラリNeon がどのようなタイプの デバック出力を生成するかを指定するものです。デフォルトは 0で、すべてデバッグ出力を無効にします。Subversion がNeonをどのように使うかについての詳細は 章 8. 開発者の情報を見てください。

ssl-authority-file

これは HTTPS 経由でリポジトリにアクセスするときに Subversion クライアントによって受け入れられる認証機関(あるいは CA)の 証明書を含むファイルパスのリストをセミコロンで区切ったものになります。

ssl-trust-default-ca

Subversion が自動的に OpenSSL に付いているデフォルトのCA を信用する ようにしたい場合にはこの変数をyesにしてください。

ssl-client-cert-file

ホスト(あるいは何台かのホスト)が SSL クライアント証明書を要求する場合 普通は証明書のあるパスを入力するようにユーザにうながします。そのパスを この変数に設定すると Subversion はユーザの入力なしにクライアント証明書 を自動的に探すことができるようになります。証明書をディスク上に保存する ための標準的な場所はありません; Subversion は指定したどのようなパスから でもそれを取得することができます。

ssl-client-cert-password

SSL クライアント証明書ファイルがパスフレーズで暗号化されている場合 Subversion はその証明書を利用するたびにパスフレーズの入力を求めます。 これが嫌なら(そしてserversファイル中に 自分のパスワードを保存するのが嫌でなけれぱ)、この変数に証明書の パスフレーズを設定することができます。これでパスフレーズを聞かれる ことはなくなります。

config

config ファイルは、Subversion実行時 オプションのうち、現在利用できる残りのもので、ネットワークに 関連するもの以外が含まれています。現時点ではいくつかのオプション が利用できるだけですが、今後の追加を考えて、別のセクションとして グループ化してあります。

auth セクションはSubversionのリポジトリに対する 認証と許可に関係した設定があります。それは:

store-passwords

これはSubversionにサーバ認証チャレンジに対してユーザが 入力するパスワードをキャッシュするかどうかを指示します。 デフォルトはyes です。noに 設定するとディスク上でのパスワードのキャッシュを無効にします。 このオプションはsvn コマンドインスタンスのどれか で--no-auth-cache を使うと上書きすることができます。 (あるいはこの引数をサポートしているコマンドであればどれでも)。 詳細はクライアント証明のキャッシュ項を参照してください。

store-auth-creds

この設定は store-passwordsと同じですが、ディスク上 にキャッシュする すべての認証情報を有効にしたり 無効にするところが違います。このような情報にはユーザ名、パスワード サーバ証明書、その他のキャッシュ可能な認証情報すべてが含まれます。

helpers セクションはSubversionがどの 外部アプリケーションをいくつかの処理で使うかを制御します。 このセクションで有効なものは:

editor-cmd

これはSubversionがコミット時のログメッセージを作るのにどのプログラムを 使うかを指定します。たとえば、svn commit が、 --message (-m)も --file (-F) オプション もなしで実行されたような場合です。このプログラムはまたsvn propeditコマンドでも使います—一時的なファイルに ユーザが編集したいと思う現在の属性値が書き込まれますが、これは エディタの起動によって実行されます。(属性項 参照)。このオプションはデフォルトは空です。もしこのオプションが設定 されていないとSubversionは環境変数 SVN_EDITOR, VISUAL, と EDITOR (この順序で) を調べます。

diff-cmd

これは差分表示プログラムの絶対パスを指定します。このプログラムは Subversionが 「diff」 の出力を生成するのに利用 されるものです( svn diff コマンド実行時 などです)。デフォルトで Subversion は内部的な差分ライブラリを 利用します—このオプションによって外部プログラムを使って 処理するようになります。そのようなプログラムの使い方の詳細は 外部差分ツールの利用項を見てください。

diff3-cmd

これはスリーウェイ差分プログラムの絶対パスを指定します。Subversion はこのプログラムをリポジトリから受け取った、ユーザがした変更点を マージするのに使います。デフォルトで Subversion は内部的な差分 ライブラリを利用します—このオプションを設定すると、外部プログラムを 使って処理を実行するようになります。そのようなプログラムの使い方の 詳細は 外部差分ツールの利用項 を見てください。

diff3-has-program-arg

このフラグはdiff3-cmd オプションが --diff-program パラメータを受け付ける場合には trueを指定すべきです。

tunnels セクションでは svnservesvn://クライアント接続を使った新しいトンネルスキーマを定義する ことができます。詳細はSSH 認証と認可項を参照してください。

miscellany セクションは他の場所に置けない すべてのものの置き場所です。 [29] このセクションには:

global-ignores

svn statusコマンドを実行するとSubversionは バージョン化されないファイルとディレクトリをバージョン化されて いるものと一緒に一覧表示します。このときバージョン化されていない ことを? 文字で表現します。 (svn status参照)。 ときどき、あまり興味のないバージョン化されないアイテムが表示されるのを 見るのを面倒に思うことがあります。 —たとえば、プログラムのコンパイルによってできるオブジェクトファイル など— global-ignores オプションは空白で区切られたグロブの リストで、バージョン化されていないのであればSubversionに表示して欲しく ないものの名前の指定になります。デフォルトは *.o *.lo *.la #*# .*.rej *.rej .*‾ *‾ .#* .DS_Storeです。

svn status のほか、 svn addsvn import コマンドもリストにマッチするファイルを無視します。 どのコマンドでも--no-ignore フラグを使うとこのオプションをその実行に限って上書きできます。 無視するアイテムについてのもっと細かい制御については svn:ignoreを見てください。

enable-auto-props

これは Subversion に新規追加またはインポートしたファイルの属性を 自動的に設定するように指示します。デフォルト値はno なので有効にするにはyesにしてください。 このファイルのauto-propsセクションはどの属性が どのファイル上に設定されるかを指定します。

log-encoding

この変数はログメッセージをコミットするキャラクタセットのデフォルト エンコーディングを設定します。これは --encoding オプションを無条件に有効にするものです( svn のスイッチ項 参照)。Subversion リポジトリはログメッセージを UTF8 で保存し、あなたの ログメッセージはあなたのオペレーティングシステムの独自のロカールを使って 書き込まれることを仮定しています。他のエンコーディングで書いたメッセージ をコミットしたい場合には別のエンコーディングを指定すべきです。

use-commit-times

通常作業コピーのファイルはどんな操作をしたかにかかわらず最後に触った 時刻を反映したタイムスタンプを持ちます。これはエディタで編集したか、 他のsvnサブコマンドを使ったかにはよりません。 これは普通はソフトウェア開発者にとって便利なものですが、それは ビルドシステムはよくどのファイルが再コンパイルを必要としているか を決めるのにタイムスタンプを見るためです。

しかし別の状況ではリポジトリで変更された最終時刻を反映しているような タイムスタンプが作業ファイルに振られているほうが便利であることも あります。 svn exportコマンドは常に、このような 抽出したツリー上の 「最終コミット時間」 を振りますが、この設定変数を yesにすると、svn checkout, svn update, svn switch, そして svn revertについても同様に、それらの操作が 触れたファイルに最終コミット時間を振るようになります。

auto-propsセクションは Subversion クライアントが追加 またはインポートしたファイルの属性を自動的に設定する能力を制御します。 そこには PATTERN = PROPNAME=PROPVALUEの形をした 任意数のキー・属性値の組を置くことができますが、ここでPATTERN はファイル名称にマッチするような正規表現で、行の残りの部分は対応する属性と その値です。ファイルに複数の要素がマッチすれば、そのファイルに複数の属性が 設定されることになります; しかし設定ファイル中に列挙された auto-props が その順序で適用されるかどうかの保証はないので一つの規則で別の規則を 「上書き」することはできません。config ファイル中に、auto-props を使ったさまざまな例を見つけることができる でしょう。最後に、auto-props を有効にするにはenable-auto-propsyesにするのを忘れずに。



[28] APPDATA 環境変数は Application Data 領域を 指しているので、常にそのフォルダを%APPDATA%¥Subversion のように参照することができます。

[29] 残り物でディナーはいかが?