2011年2月1日火曜日

Subversion導入時の注意点(改行コード、実行権限) その2

前回のエントリでは、Subversionで発生した改行コードおよび実行権限の問題について、その対処方法を書きました。
今回のエントリでは、そもそもそういった問題が発生しないためには何をすればよかったのか?について書きたいと思います。

前回のおさらいになりますが、最終的な結論として、

・実行ビットが必要なファイルには、svn:executable 属性を設定
・テキストファイルには、svn:eol-style 属性に native という値を設定

を行えば、問題は回避できるということでした。

ただ、これらの設定を毎回手動で行うのは面倒ですし、うっかり忘れたりすることも考えられます。
でもご安心ください。
リポジトリにファイルを追加するときに、これらの属性設定を自動的に行う機能がSubversionクライアントには備わっていました。

例として、次のような条件で自動的に属性を設定したいと仮定します。

・拡張子がplというファイルには実行権限を設定
・拡張子がplおよびpmというファイルはテキストファイルなので、OSに依存しない改行コードに正規化

この場合、次の内容をSubversionクライアントの設定ファイルに書いておくと、次回のaddからはファイルの拡張子を見て、自動的に属性を設定してくれます。

enable-auto-props = yes

[auto-props]
*.pl = svn:eol-style=native;svn:executable
*.pm = svn:eol-style=native


この例では *.pl と *.pm だけでしたが、実際はもっと色々な拡張子に対応したものになるかと思います。
こちらのサイトには、様々な拡張子を網羅した、とても良い設定例が載っていますので、ここの設定をベースにして、自分の環境用にアレンジするのが良いと思います。

なお、設定ファイルの場所は、Subversionクライアントによって異なります。
参考までに、私が使ったことのあるものだと以下の場所になります。

・Linuxのsvnコマンドの場合
~/.subversion/config というファイルが設定ファイルになります。

・WindowsのTortoiseSVNの場合
右クリック→TortoiseSVN→Settingsを開き、Generalの「Subversion configuration file」の「Edit」ボタンをクリックすると設定ファイルが開きます。


というわけで結論:
これからSubversionを導入して、ファイルのバージョン管理を行うプロジェクトは、
一番最初に全てのメンバーに対して、プロジェクトで採用する設定ファイルを共有しておく。
その後は特に何も心配しなくてもOK。



不幸にも、私の場合のように、すでにSubversionを導入済みで、後から問題に気づいてからこの設定を行った場合は話が面倒です。
なぜなら、残念なことに、すでにリポジトリ上に存在するファイルに対しては、この設定は意味を持ちません。
あくまでも今後add(リポジトリへのファイルの追加)する時に意味を持ちます。
つまり、すでにリポジトリに存在するファイルについては、スクリプトなどを使って、前回のエントリで紹介したような属性設定の操作(svn psコマンド)を必要な全てのファイルに対して行う必要があります。

さらに不幸なことに、1つのファイルの中に異なる形式の改行コードが混在するファイルがリポジトリにうっかりCommitされている場合は、svn:eol-style=native 属性を後から設定したくても以下のようなエラーが発生して設定できません。

$ svn ps svn:eol-style 'native' foo.txt
svn: File 'foo.txt' has inconsistent newlines


というわけで、不幸にも私のような状況になってしまった方は、
・改行コードの統一
・属性の設定
という作業を必要な全てのファイルに対して、スクリプトなりを使って頑張ってやるしかないということになります。
幸い、先程紹介したサイトに、スクリプトのサンプルが載っていました。
それを参考に、このエントリで書いた設定例の設定をリポジトリ上のファイルにも適用したい場合には、どういったスクリプトを実行すればよいのかを書きます。

# 改行コードの統一
$ find . -type f -name \*.pl -print0 | xargs -0 perl -i -pe "s/\r\n/\n/"
$ find . -type f -name \*.pm -print0 | xargs -0 perl -i -pe "s/\r\n/\n/"

# 属性の設定
$ find . -type f -name \*.pl -print0 | xargs -0 svn propset svn:eol-style native
$ find . -type f -name \*.pl -print0 | xargs -0 svn propset svn:executable ''
$ find . -type f -name \*.pm -print0 | xargs -0 svn propset svn:eol-style native


これ以上、この問題の餌食になる人が出ないことを祈ります。。。
皆様も本当に気をつけてください。

参考にしたURL:
http://openlab.dino.co.jp/2008/10/15/212603361.html

0 件のコメント:

コメントを投稿