虽然有时候可以通过authz文件来控制某些目录的读写问题,但是在一个repository中有多个子目录,然后每个目录中都有tags目录,可能还有3级情况。如果还是通过authz来控制的话,你会崩溃的。
现在可以用svn的hooks功能来完成禁止tags修改功能。hook是什么?网上有很多资料,我就不再这儿废话了。只想说hook可以是任何形式的可执行程序,如shell script, php, python, 你自己写c程序. 唯一要注意的是它的程序名字一定要是hooks/pre-commit.tmpl 模板名的前缀名,即 pre-commit。
实现"禁止修改tag"功能,就是在pre-commit中实现的,我这里用的是bash shell script完成。
下面代码功能包括:
1. 提交时写message的字数限制
2. 禁止任何修改tag
3. 管理员可以删除tag,但也不能修改,这里的管理员就是“deyilong”
REPOS="$1"
TXN="$2"
# Make sure that the log message contains some text.
SVNLOOK=/usr/local/bin/svnlook
#it needs somewhat numbers of commiting message
LOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
Len_log=`echo ${#LOG}`
if [ $Len_log -le 10 ]; then
echo -e "/nThe Length of Committing Message is Too Short!" 1>&2
exit 1
fi
#prevent someone from modifying a tag
MSG=`$SVNLOOK dirs-changed -t "$TXN" "$REPOS"`
echo $MSG | grep '//tags//' > /dev/null
if [ $? -eq 0 ]; then
echo $MSG | grep '//tags//$' > /dev/null
if [ $? -ne 0 ]; then
echo -e "/nCannot Change A Tag! Please Recreate A New Tag." 1>&2
exit 1
else
$SVNLOOK changed -t "$TXN" "$REPOS" |grep '^A' > /dev/null
if [ $? -ne 0 ]; then
$SVNLOOK author -t "$TXN" "$REPOS" |grep '^deyilong$' > /dev/null
if [ $? -eq 0 ]; then
exit 0
else
echo -e "/nCannot Change A Tag! Please Recreate A New Tag." 1>&2
exit 1
fi
fi
fi
fi