SVN hooks——pre-commit

小半个月没有用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 服务运行用户并加上ownerx权限)

没做这两步的话,当你在客户端提交空信息的时候,相应的错误提示信息并不会被输出反馈到客户端上。

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的人,真是头大~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章