SVN提交前主要想校验两个地方。
首先是提交日志,其次是文件名不能含有空格(SVN老版本的bug)。
Hook钩子脚本目录
进入/{服务器端仓库地址}/hooks,如我的是SVN产库钩子目录为:/svn/hooks。
hooks目录文件列表,都是一些样例模板。
-rw-r--r-- 1 apache apache 1977 Feb 25 10:44 post-commit.tmpl
-rw-r--r-- 1 apache apache 1638 Feb 25 10:44 post-lock.tmpl
-rw-r--r-- 1 apache apache 2289 Feb 25 10:44 post-revprop-change.tmpl
-rw-r--r-- 1 apache apache 1567 Feb 25 10:44 post-unlock.tmpl
-rw-r--r-- 1 apache apache 3426 Feb 25 10:44 pre-commit.tmpl
-rw-r--r-- 1 apache apache 2434 Feb 25 10:44 pre-lock.tmpl
-rw-r--r-- 1 apache apache 2786 Feb 25 10:44 pre-revprop-change.tmpl
-rw-r--r-- 1 apache apache 2122 Feb 25 10:44 pre-unlock.tmpl
-rw-r--r-- 1 apache apache 2780 Feb 25 10:44 start-commit.tmpl
Hook钩子脚本实现
我们复制一份pre-commit.tmpl文件,清空里面内容改名为pre-commit,写入如下脚本。
#!/bin/bash
REPOS="$1"
REV="$2"
# count commited file num
check=$(svnlook changed -t $REV $REPOS | awk 'NF!=2{for(i=2;i<=NF;i++)if(i!=NF)printf $i" ";if(i=NF)printf $i","}')
# compare files
if [ "$check" != "" ]
then
check_del=$(svnlook changed -t $REV $REPOS | awk '{for(i=1;i<NF;i++)if($i=="D")print $1}')
if [ "$check_del" == "" ]
then
echo "***************************************" 1>&2
echo "The file name contains spaces.:" 1>&2
echo "${check}" 1>&2
echo "please fix it and try again." 1>&2
echo "***************************************" 1>&2
exit 1
fi
fi
LOGMSG=`svnlook log -t "$REV" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ "$LOGMSG" -lt 5 ];
then
echo "***************************************" 1>&2
echo -e "at least 5 words!" 1>&2
echo "please fix it and try again." 1>&2
echo "***************************************" 1>&2
exit 1
fi
exit 0
更改文件授权和所有者
执行如下脚本,所有者请自行适配替换掉其中的”apache:apache”。
chown apache:apache pre-commit
chmod 777 pre-commit
文件最后状态如下。至此每次SVN提交前都会校验空提交和文件名带空格。
-rwxrwxrwx 1 apache apache 972 Feb 25 11:58 pre-commit