小半个月没有用svn了,自己对这个东西实在是不熟悉,无奈还是要硬着头皮去解决问题。这个礼拜又建了个新的版本库,今天看见大家提交了很多代码,但很大一部分人都没有写log信息,这个可不是什么好习惯。虽然最近大家都很忙,但每次抽个几分钟,把这次提交的原因简单说说还是比较好的,至少方便别的人查看历史信息呢。
于是就想修改一下pre-commit的钩子程序,在commit之前强制大家输入注释信息。网上有很多关于这方面的资料。有以下几种处理方法(Linux系统):
1.进入仓库/hooks目录,找到pre-commit.tmpl文件,重命名,去掉后缀.tmpl。 编辑pre-commit文件:
将:
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep "[a-zA-Z0-9]" > /dev/null || exit 1
commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1
这三行注释掉(前面加#符号),
在此位置添加如下几行:
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ "$LOGMSG" -lt 5 ];#要求注释不能少于5个字符,您可自定义
then
echo -e "\nLog message cann't be empty! you must input more than 5 chars as comment!." 1>&2
exit 1
fi
保存,退出。
给pre-commit添加可执行权限:
chmod +x pre-commit
配置结束,可以使用了。
2.pre-commit hook 的脚本可以是 shell, perl, python, exe 等多种格式。比如一个简单的防治提交说明信息为空的shell脚本:
#!/bin/sh
REPOS="$1"
TXN="$2"
RES="OK"
# Make sure that the log message contains some text.
SVNLOOK=svnlook
$SVNLOOK log -t "$TXN" "$REPOS" \
| egrep "[^[:space:]]+" >/dev/null || unset RES
if [ "$RES" != "OK" ] ; then
echo "You must input some comments for you commit" 1>&2
exit 1
fi
# All checks passed, so allow the commit.
exit 0
把写好的脚本文件放置到相应的版本库目录下的 hooks 文件夹中即可(在 hooks 目录下也已经有各种 hook 脚本的模板供参考)。
1)echo 错误提示信息的时候必须重定向到 stderr ,即 1>&2
2)pre-commit 文件拷贝到 hooks 目录之后,需要 chmod 0755 pre-commit ,给 pre-commit 文件增加可执行权限(或者至少把文件owner改为 svn 服务运行用户并加上owner的x权限)
没做这两步的话,当你在客户端提交空信息的时候,相应的错误提示信息并不会被输出反馈到客户端上。
3下面这个 pre-commit hook 只是很简单的不允许空白或不含字母的 commit log
#!/usr/bin/perl
# pre-commit hook to reject commit with empty log
# remember to chmod 755 on this file
die "Usage: $0 [REPOS] [TXN]\n" unless @ARGV > 1;
$REPOS=$ARGV[0];
$TXN=$ARGV[1];
$svnlook = '/usr/local/bin/svnlook';
chomp($author=`$svnlook author -t $TXN $REPOS`);
chomp($log=`$svnlook log -t $TXN $REPOS`);
if( $log eq '' || $log =~ /^\W+$/ ) {
die "\nHello, $author. Empty commit log is not permitted!\n";
}
exit(0);
http://www.worldhello.net/doc/svn_hooks/svn_hooks.mm.htm这里面有比较详细的对svn hooks的说明。
目前找到了这样的几篇文章,原以为是一个很简单的问题,一下就弄好了,结果折腾了一下午还是不行。我采用的是与方法1一样的代码,结果开始忘记chmod了,然后就一直报错Commit blocked by pre-commit hook (exit code 255) with no output
后来终于想起来了,chmod +x pre-commit之后,提交的时候即使不输入log信息,也一样可以正常提交,貌似没有执行if then语句,想了半天也不知道为什么。明天有空再试试呢。
有时候一个问题想起来很简单,可是实现起来总是有些小插曲,尤其是我这种既不懂linux也不熟悉shell的人,真是头大~