我想使用一个预提交钩子来防止开发人员在非根目录上设置 svn:mergeinfo。也就是说,我想强制 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(如在后一个脚本中)来获取目录的更改属性并通过相应的路径,无论它们是使用正则表达式的分支还是标签。
更新
找到了执行器预提交钩子脚本,这似乎是您正在寻找的。
这个脚本的作用是它使用 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