需求:上传到SVN服务器的项目文件如果被普通用户误删了,虽然能恢复,但是如果删除的文件比较多,注释的内容简单,恢复的时候需要一个个的保存到本地,然后再上传到服务器上,会很麻烦,可能还会出现提交代码版本冲突的问题,那么,怎么才能禁止普通用户删除SVN服务器的项目文件呢?
一、找到需要加权限的版本库中hooks目录下的pre-commit.tmpl文件,备份并将其重命名为pre-commit脚本文件。
cd /var/www/svn/Network_Group/hooks # 这是我要修改的版本库位置
cp pre-commit.tmpl pre-commit.tmpl-backup # 备份
mv pre-commit.tmpl pre-commit # 重命名
二、修改pre-commit文件内容
vim pre-commit,文件内容默认如下:
注释掉73-78行的内容,增加80-91的内容,下面的脚本复制粘贴就可以
if [ -z `$SVNLOOK log -t "$TXN" "$REPOS" |grep "[a-zA-Z0-9]"` ];then
echo "请输入注释!" >&2
exit 1
fi
USER=`$SVNLOOK author -t $TXN $REPOS`
ADMINLIST=admin,zhangsan # 这里是拥有删除权限的用户,逗号隔开
if [ "`echo $ADMINLIST|grep -w $USER|wc -l`" -eq 0 ];then
if [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ];then
echo "你没有权限删除,请联系管理员删除!" >&2
exit 1
fi
fi
ADMINLIST=admin,zhangsan 表示只有admin和zhangsan这两个用户有删除文件的权限,如果还有其他人,只需用逗号隔开,当然,这些用户名需要在conf下的passwd文件中进行配置
三、给 pre-commit 脚本文件执行权限 chmod 755 pre-commit,不需要重启SVN
四、测试
1、没有输入注释时,提示:
2、删除时若没有权限,提示:
脚本说明:
#!/bin/sh
REPOS="$1" # 库位置
TXN="$2" # 版本
# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook # svnlook的位置
if [ -z `$SVNLOOK log -t "$TXN" "$REPOS" |grep "[a-zA-Z0-9]"` ];then # 如果commit的用户没有输入注释
echo "请输入注释!" >&2 # 提示错误
exit 1 # 错误退出
fi
USER=`$SVNLOOK author -t $TXN $REPOS`
ADMINLIST=GuoJiHe,melonlink # 这里是拥有删除权限的用户,逗号隔开
if [ "`echo $ADMINLIST|grep -w $USER|wc -l`" -eq 0 ];then # 如果commit的用户没在ADMINLIST里面
if [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ];then # 如果开头包含D(D代表删除)
echo "你没有权限删除,请联系管理员删除!" >&2 # 提示错误
exit 1 # 错误退出
fi
fi
本文参考自其他博客:
(1)https://blog.csdn.net/helijie92902/article/details/54534156