小半個月沒有用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的人,真是頭大~