この記事は、元の場所http://blogs.collab.net/subversion/the-road-to-repository-dictated-configuration-day-2-autopropsから許可を得てミラーリングされています。無効なリンクは削除または更新されています。
著者: Paul Burba
投稿日時 2013-06-25
第1部では、Subversion 1.8 の新しい継承可能なプロパティ機能について説明しました。この機能により、リポジトリ定義済み設定 (RDC) の道が開かれることをお約束しました。今日は、1.8 の RDC 関連機能の最初の部分である新しいsvn:auto-props
プロパティをご紹介します。
Subversion は、Subversion クライアントの操作のさまざまな側面を制御する、広範なユーザー設定可能なオプションを提供しています。同じ場所に少数のコミッタしかいないリポジトリの場合、これらの設定を手動で同期するのはそれほど難しくないでしょう。しかし、大規模で分散されたグループの場合、全員が同じ設定を持つようにすることはますます困難になります。Subversion は、フックスクリプトを介して、これらの設定の一部を強制するためのメカニズムを提供しています。しかし、フックスクリプトは、その性質上、事後的な強制しか行いません。フックスクリプトは、正しく設定されていないユーザーによるコミットを拒否できますが、ユーザーの設定を修正することはできません。
より良い解決策は、リポジトリの動作コピーに対して直接的、間接的に適用されるリポジトリ全体のsettingsをクライアントの設定をシームレスに補完する、リポジトリ定義済み1設定です。この分野で最も一般的に要求される機能の1つは、Subversion 1.8 が新しい予約済みsvn:auto-props
プロパティで提供する、自動プロパティ設定のリポジトリ定義済み値です。
これは高レベルのリフレッシュです。詳細については、Subversionによるバージョン管理の書籍を参照してください。
Subversion 1.7 では、svn add
またはsvn import
サブコマンドを使用してファイルをバージョン管理に追加すると、Subversion はそのファイルに共通のプロパティを自動的に設定しようとします。これらのプロパティの一部(例:svn:executable
、svn:mime-type
)は設定に関係なく設定されますが、他のプロパティ(例:svn:eol-style
)2は、個々の実行時設定の詳細に依存します。これらの設定は、コマンドラインで–config-optionおよび–config-dirオプションを使用して上書きできます。
今日私たちに関心のある設定セクションは、auto-props です。このセクションでは、追加/インポートされたファイルに自動的に設定されるプロパティを定義できます。たとえば、次のような設定があるとします3
### Set enable-auto-props to 'yes' to enable automatic properties ### for 'svn add' and 'svn import', it defaults to 'no'. ### Automatic properties are defined in the section 'auto-props'. enable-auto-props = yes ### Section for configuring automatic properties. [auto-props] ### The format of the entries is: ### file-name-pattern = propname[=value][;propname[=value]...] ### The file-name-pattern can contain wildcards (such as '*' and ### '?'). All entries which match (case-insensitively) will be ### applied to the file. Note that auto-props functionality ### must be enabled, which is typically done by setting the ### 'enable-auto-props' option. *.c = svn:eol-style=native *.cpp = svn:eol-style=native *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native *.dsp = svn:eol-style=CRLF *.dsw = svn:eol-style=CRLF *.sh = svn:eol-style=native;svn:executable *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL; *.png = svn:mime-type=image/png *.jpg = svn:mime-type=image/jpeg Makefile = svn:eol-style=native
上記の設定では、.c
拡張子のファイルをバージョン管理下に置くと、そのファイルにはsvn:eol-style
プロパティがnative
の値で自動的に設定されます。
1.8.0>svn st ? src\panel.c 1.8.0>svn add src\panel.c A src\panel.c 1.8.0>svn proplist src\panel.c --verbose Properties on 'src\panel.c': svn:eol-style native
素晴らしいですが、リポジトリ管理者であれば、すべてのユーザーがこのように設定を手動で設定することを期待する必要があります4。リポジトリ(またはリポジトリ内のプロジェクト)の目的の auto-prop 定義をユーザーにプッシュする方が良いでしょう5…
…新しいsvn:auto-props
プロパティが登場します。この新しいプロパティの値は、auto-props 実行時設定オプションと同じ形式にする必要があります。つまり、FILE_PATTERN = PROPNAME=VALUE[;PROPNAME=VALUE ...]形式の、改行で区切られた複数のキーバリューペアです。
前の例のランタイム設定と非常によく似た値で、リポジトリのルートにsvn:auto-props
プロパティを設定している場合があります。
1.8.0>svn pg svn:auto-props http://svn.example.com/repos --verbose Properties on 'http://svn.example.com/repos': svn:auto-props *.c = svn:eol-style=native *.cpp = svn:eol-style=native *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native *.dsp = svn:eol-style=CRLF *.dsw = svn:eol-style=CRLF *.sh = svn:eol-style=native;svn:executable *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL; *.png = svn:mime-type=image/png *.jpg = svn:mime-type=image/jpeg Makefile = svn:eol-style=native
svn:auto-props
プロパティの値は、プロパティを継承するディレクトリの場所に追加またはインポートされたパスに対する自動プロパティを定義します。
新しいプロパティが自動プロパティを設定する方法の非常に簡単な例を見てみましょう。実行時設定では auto-props が定義されていないと仮定します。
### Set enable-auto-props to 'yes' to enable automatic properties ### for 'svn add' and 'svn import', it defaults to 'no'. ### Automatic properties are defined in the section 'auto-props'. enable-auto-props = no
さらに、リポジトリ管理者が以前にリポジトリのルートにsvn:auto-props
プロパティを設定していると仮定します6
1.8.0>svn propget svn:auto-props --verbose -R http://svn.example.com/repos Properties on 'http://svn.example.com/repos': svn:auto-props *.c = svn:eol-style=native *.h = svn:eol-style=native *.py = svn:eol-style=native
現在のプロジェクトの新しいワーキングコピーをチェックアウトします。
1.8.0>svn co http://svn.example.com/repos/calc/trunk calc-trunk-wc A calc-trunk-wc\doc A calc-trunk-wc\src A calc-trunk-wc\doc\INSTALL A calc-trunk-wc\FAQ A calc-trunk-wc\src\button.c A calc-trunk-wc\src\integer.c A calc-trunk-wc\src\real.c A calc-trunk-wc\src\main.c A calc-trunk-wc\Makefile A calc-trunk-wc\README U calc-trunk-wc Checked out revision 480.
作業後、バージョン管理下に置く新しいファイルがあります。
1.8.0>svn st calc-trunk-wc ? calc-trunk-wc\src\bindings.h 1.8.0>svn add calc-trunk-wc\src\bindings.h A calc-trunk-wc\src\bindings.h
そうすると、リポジトリのルートから継承されたsvn:auto-props
プロパティにより、追加されたファイルにsvn_eol-style
プロパティが自動的に設定されます。
1.8.0>svn pg svn:auto-props -v --show-inherited-props calc-trunk-wc\src\bindings.h Inherited properties on 'calc-trunk-wc\src\bindings.h', from 'http://svn.example.com/repos': svn:auto-props *.c = svn:eol-style=native *.h = svn:eol-style=native *.py = svn:eol-style=native 1.8.0>svn pl -v calc-trunk-wc\src\bindings.h Properties on 'calc-trunk-wc\src\bindings.h': svn:eol-style native
前の例はおそらく、遭遇するsvn:auto-props
に関連する最も単純なケースでしょう。しかし、次のような場合はどうなりますか?
foo/bar.bat
を追加し、foo
が異なる親から複数のsvn:autoprops
を継承し、それらのプロパティが同じファイルパターンに対して異なる値を持っている場合。--config-options
または--config-dir
オプションを使用する場合。これらの場合、次のルールが適用されます。
A) svn:auto-props
は実行時設定のauto-propsを上書きします。 svn:auto-props
で定義された特定のパターンに対する自動プロパティは、auto-props実行時設定7にある同じパターンに対する同じauto-propを上書きします。
B) より近いsvn:auto-props
が優先されます。 同じパターンに対する自動プロパティが複数の親のsvn:auto-props
プロパティから継承されている場合、パス的に近い親がより遠い親を上書きします。
C) 明示的なsvn:auto-props
は継承されたものを優先します。 特定のパターンに対してパスに明示的に設定されたsvn:auto-props
プロパティで定義された自動プロパティは、任意の親から継承された同一のパターンに対する同じauto-prop(s)を上書きします。
D) ファイルが複数のパターンに一致する場合、保証はありません。 auto-props 実行時設定オプションと同様に、ファイルが同じプロパティの値を定義する複数ファイルパターンに一致する場合、どのパターンの値が自動的に適用されるかの保証はありません。たとえば、追加されたファイルfoo.py
が次の両方の値を継承する場合。
*.py = svn:eol-style=native *.p* = svn:eol-style=CRLF
追加されたファイルfoo.py
にどのeol-styleが設定されるかの保証はありません。
E) --no-auto-props
は自動プロパティを無効にします。 auto-props 実行時オプションと同様に、コマンドラインで--no-auto-props
オプションを使用すると、svn:auto-props
プロパティが無視されます。
F) 実行時設定で自動プロパティを無効にしても、RDCには影響しません。 実行時設定オプションのenable-auto-propsがnoに設定されている場合でも、svn:auto-props
は無効になりません。
<pre>### Set enable-auto-props to 'yes' to enable automatic properties ### for 'svn add' and 'svn import', it defaults to 'no'. ### Automatic properties are defined in the section 'auto-props'. ### Note: Setting this option to 'no' has no effect on the behavior of ### the svn:auto-props property enable-auto-props = no</pre><
svn:auto-props
は継承可能であることを忘れないでください。そのため、通常はリポジトリのルートにプロパティを設定するだけで済みます。リポジトリに異なる設定を必要とする複数の異なるプロジェクトがある場合は、各プロジェクトのルートフォルダにプロパティを配置できます8。継承可能なプロパティに関しては、少ないほど良いことを忘れないでください。特定のリポジトリパスが複数の親から同じ値を継承するようにsvn:auto-props
を設定している場合、おそらく必要以上に多くのことを行っているでしょう。
完全開示:ここで説明されているリポジトリ「定義済み」設定は、実際には動作の良い1.8以降のクライアントへの提案に過ぎません。古いクライアントは明らかに新しい指示を理解しません。新しいクライアントでも、ユーザーがクライアントを変更してサーバー側の提案を無視することは比較的簡単です。結局のところ、Subversionはオープンソースです!この現実を踏まえ、100%のコンプライアンスが必要な場合は、フックスクリプトによる望ましい動作のサーバー側強制が依然として推奨されます。↩
svn:mime-type
は実際には両方のカテゴリに分類されます。実行時設定で設定できますが、何も定義されていない場合、Subversion はハードコーディングされたルールセットを使用して MIME タイプを自動的に設定しようとします。↩
ここでは簡略化していることを認めます。単一ユーザー設定だけでなく、最大4つの場所で定義できます。
番号の小さい設定は、番号の大きい設定よりも優先されます。このブログの例では、簡略化のため、設定#2~#4は空であり、設定全体は#1のみに定義されていると仮定します。↩
Subversionは、デフォルトの設定では自動プロパティを設定しません。↩
つまり、リポジトリが設定を決定します!↩
svn:auto-props
プロパティは、ディレクトリに対してのみ設定できることに注意してください。↩
標準のランタイム設定、または--config-dir
オプションで指定された設定のいずれかです。↩
パート1で説明したように、すべてのユーザーは、svn:auto-props
を設定したディレクトリへの読み取りアクセス権を持っている必要があります。そうでない場合、そのパスから継承できません。↩
ポール・バーバは、Apache Software FoundationのSubversionプロジェクトのコミッターであり、過去9年間Subversionに取り組んでいます。彼はニューハンプシャー州の自宅でCollabnetのソフトウェアエンジニアとして勤務しており、コーディングをしていないときは、甥っ子とスキーをしたり、友人とマウンテンバイクに乗ったり、妻と旅行に出かけたりしています。昔、ポールはニューハンプシャー大学でビジネスの学位を取得しました。比較的最近、ボストン大学でコンピュータサイエンスの修士号を取得しました。