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

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