我想使用一个 pre-commit 钩子来防止开发人员在非根目录上设置 svn:mergeinfo。也就是说,我希望强制要求只有像 "trunk" 或 "branches/branchName" 这样的目录才能设置 svn:mergeinfo。有时候需要“提醒”开发人员不要将根目录的子目录用作合并目标(根据这里列出的最佳实践)。请问是否有这样的钩子脚本或者知道哪里可以找到?我在 Windows 环境中,因此批处理或 Powershell 更好,但任何东西都肯定会有所帮助。
我想使用一个 pre-commit 钩子来防止开发人员在非根目录上设置 svn:mergeinfo。也就是说,我希望强制要求只有像 "trunk" 或 "branches/branchName" 这样的目录才能设置 svn:mergeinfo。有时候需要“提醒”开发人员不要将根目录的子目录用作合并目标(根据这里列出的最佳实践)。请问是否有这样的钩子脚本或者知道哪里可以找到?我在 Windows 环境中,因此批处理或 Powershell 更好,但任何东西都肯定会有所帮助。
它包含几种方法,其中之一是verify_property_line_added()。因为它是对每个添加到文件属性上的行都进行调用。此脚本使用svnlook来查看事务的进度。在筛选事务时,它调用一组钩子,允许存储库管理员检查正在进行的操作并决定是否接受。
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