Subversionのサーバ側(Windows系)で特定のファイルがコミットされることを防止したい


リポジトリフォルダ内のhooksフォルダに、
「pre-commit.bat」というファイル名で以下の内容のバッチファイルを作成して下さい。


set REPOS=%1
set TXN=%2
set IGNORE=\.obj \.dcu

svnlook changed -t "%TXN%" "%REPOS%" |FindStr -i "%IGNORE%"
if %errorlevel% == 0 (
echo "Sorry. %IGNORE% is can't Commit. Please uncheck those files." >&2
exit 1 
) else (
exit 0
)

注意点
・Svn導入サーバにて、svnlookにパスが通っていることが必要。
・同一リポジトリ管理下の全てに影響する筈なので、多分使い辛い。
・プロジェクトメンバーに事前に説明した方が良さそう。

解説
REPOS=%1、TXN=%2 はコミット操作時にsvnサーバからpre-commit.batに渡される引数で、
REPOSがリポジトリURL、TXNがリビジョン。

IGNOREが、コミットさせたくないファイルのファイル名に含まれる文字列です。任意に設定して下さい。
スペース区切りで複数設定可能です。今回は拡張子を設定してみました。
※正規表現にて検索しますので、「.」はメタ文字となります。.と記述する必要が有ります。

svnlook changed にて、コミット時に変化の合ったファイル名が取得できるので、
そこからFindStr で一致する文字列が有るかをパイプで絞り込みます。
FindStr の-iオプションは「大文字小文字を区別しない」です。

一致が有れば、%errorlevel%に0が入るので、標準出力としては1(0以外であればよい)を返します。
標準エラー出力(>&2)にメッセージを出すと、クライアント(TortoiseSVNとか)に表示可能です。

一致が無ければ、0を標準出力します。

トライ&エラーを繰り返し、手探りで作成したので、間違った理解が含まれている気がします。
ここを直すべき!等あれば、ご意見いただければと思います。

追記(2013/2/5)
Fileプロトコルでリポジトリにアクセスしている場合、(当然)上手く動かないです。
実際その様な事例が有り、盲点だったので。
深夜のテンションで書いた文章を手直ししました。