開発者がルート以外のディレクトリにsvn:mergeinfoを設定できないようにするpre-commitフックを使用したいと思います。つまり、svn:mergeinfoは「trunk」や「branches/branchName」などのディレクトリにのみ設定できるようにしたいと思います。開発者は、ルートのサブディレクトリをマージターゲットとして使用することは適切ではないことを「思い出させる」必要がある場合があります(ここにリストされているベストプラクティスに従って)。誰かがそのようなフックスクリプトを持っているか、私がそれを見つけることができる場所を知っていますか?私はWindows環境にいるので、バッチまたはPowerShellが望ましいですが、何でも確かに役立ちます。
2 に答える
まず第一に、タスクを実行するために perl または python を使用することをお勧めします。Windows バッチには多くの要望が残されています。
http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/のサンプル スクリプトを使用して開始できます。たとえば、verify-po.pyスクリプトはファイルのエンコーディングをチェックし、 commit-access-control.pl.inは作成者がコミットする権限を持っているかどうかをチェックします。おそらく、スクリプトでsvnlook diffを使用して (後者のように)、ディレクトリの変更されたプロパティを取得し、正規表現を使用してブランチまたはタグであるかどうかに関係なく、対応するパスをたどるでしょう。
アップデート
あなたが探していると思われるエンフォーサの pre-commit フック スクリプトが見つかりました。
このスクリプトが行うことは、svnlook を使用してトランザクションの進行状況を確認することです。トランザクションをふるいにかけると、リポジトリ管理者が何が起こっているかを調べて、それが受け入れられるかどうかを判断できるようにする一連のフックを呼び出します。
ファイルのプロパティに追加される行ごとに呼び出されるため、いくつかのメソッドとその中にverify_property_line_added()が含まれています。
サーバー上で CPAN を実行できる場合:
https://github.com/gnustavo/SVN-Hooks/blob/master/examples/check-mergeinfo.pl
そうでない場合 ( http://comments.gmane.org/gmane.comp.version-control.subversion.user/118969に基づく):
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
if !($SVNLOOK log -t "$TXN" "$REPOS" | grep -q '\[override] ';) then
# Get list of paths which have changed
TXN_PATHS=$($SVNLOOK changed -t "$TXN" "$REPOS")
# Filter those which are allowed: /trunk, /branches/*,...
TXN_PATHS=$(echo "$TXN_PATHS" | grep -Ev "^....(trunk/|branches/[^/]+/)$")
# Iterate over all paths, which are not allowed to have mergeinfo
while IFS= read -r TXN_PATH; do
ELEM_PATH=$(echo "$TXN_PATH" | cut -c 5-)
MERGEINFO=$($SVNLOOK propget "$REPOS" svn:mergeinfo -t "$TXN" "$ELEM_PATH" 2>/dev/null)
if [ ! "$MERGEINFO" = "" ]; then
echo " Cannot merge into directory that is not trunk or a branch:" >&2;
echo " $ELEM_PATH" >&2;
echo " Override by using [override]." >&2;
exit 1;
fi
done <<< "$TXN_PATHS"
# echo "Merge info check: OK"
fi