阅读更多
钩子脚本无非是利用后台的管理命令和所需要使用的hooks提供的参数。来进行的一些组合,满足的需求!
下面的帖子,先介绍了后台管理命令。然后再介绍了钩子脚本的作用和几个Demo。
一.服务器后台管理命令
1.svnlook
1)svnlook author
可跟选项
--revision (-r)
--transaction (-t)
打印版本库一个修订版本或者事物的作者。
svnlook author -r 40 /usr/local/svn/repos
2)svnlook cat
打印一个文件的内容
svnlook cat REPOS_PATH PATH_IN_REPOS
可跟选项
--revision (-r)
--transaction (-t)
svnlook cat -t ax8 /usr/local/svn/repos /trunk/README
svnlook cat -r 40 /usr/local/svn/repos /trunk/README
3)svnlook changed
打印修改的路径。
svnlook changed REPOS_PATH --最后一次修改
svn update样式的”状态字符:
'A '----条目添加到版本库。
'D '----条目从版本库删除。
'U '----文件内容改变了。
'_U'----条目属性改变了。
'UU'----文件内容和属性修改了。
文件和目录可以区分,目录路径后面会显示字符'/'。
可跟选项
--revision (-r)
--transaction (-t)
svnlook changed -r 39 /usr/local/svn/repos
4)svnlook date
$ svnlook date -r 40 /tmp/repos/
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
5)svnlook diff
svnlook diff REPOS_PATH
可跟选项
--revision (-r)
--transaction (-t)
--no-diff-added
--no-diff-deleted
$svnlook diff -r 40 /usr/local/svn/repos/
Copied: egg.txt (from rev 39, trunk/vendors/deli/pickle.txt)
Added: trunk/vendors/deli/soda.txt
==============================================================================
Modified: trunk/vendors/deli/sandwich.txt
==============================================================================
--- trunk/vendors/deli/sandwich.txt (original)
+++ trunk/vendors/deli/sandwich.txt 2003-02-22 17:45:04.000000000 -0600
@@ -0,0 +1 @@
+Don't forget the mayo!
Modified: trunk/vendors/deli/logo.jpg
==============================================================================
(Binary files differ)
Deleted: trunk/vendors/deli/chips.txt
==============================================================================
Deleted: trunk/vendors/deli/pickle.txt
==============================================================================
如果一个文件有非文本的svn:mime-type属性,区别不会明确显示。
6)svnlook dirs-changed
打印本身修改的目录
svnlook dirs-changed REPOS_PATH
可跟选项
--revision (-r)
--transaction (-t)
$svnlook dirs-changed -r 40 /usr/local/svn/repos
trunk/vendors/deli/
7)svnlook history
打印版本库(如果没有路径,则是根目录)某一个路径的历史。
可跟选项
--revision (-r)
--show-ids
$ svnlook history -r 20 /usr/local/svn/repos /tags/1.0 --show-ids
REVISION PATH <ID>
-------- ---------
19 /tags/1.0 <1.2.12>
17 /branches/1.0-rc2 <1.1.10>
16 /branches/1.0-rc2 <1.1.x>
14 /trunk <1.0.q>
13 /trunk <1.0.o>
11 /trunk <1.0.k>
9 /trunk <1.0.g>
8 /trunk <1.0.e>
7 /trunk <1.0.b>
6 /trunk <1.0.9>
5 /trunk <1.0.7>
4 /trunk <1.0.6>
2 /trunk <1.0.3>
1 /trunk <1.0.2>
8)svnlook info
打印作者、时间戳、日志信息大小和日志信息。
svnlook info REPOS_PATH
可跟选项
--revision (-r)
--transaction (-t)
$ svnlook info -r 40 /usr/local/svn/repos
sally
2003-02-22 17:44:49 -0600 (Sat, 22 Feb 2003)
15
Rearrange lunch.
9)svnlook lock
打印PATH_IN_REPOS锁定的所有信息,如果 PATH_IN_REPOS没有锁定,则不打印任何内容。
这描述了文件tree.jpg的锁定。
$ svnlook lock /svn/repos /trunk/tree.jpg
UUID Token: opaquelocktoken:ab00ddf0-6afb-0310-9cd0-dda813329753
Owner: harry
Created: 2005-07-08 17:27:36 -0500 (Fri, 08 Jul 2005)
Expires:
Comment (1 line):
Rework the uppermost branches on the bald cypress in the foreground.
10)svnlook log
打印日志信息。
svnlook log REPOS_PATH
--revision (-r)
--transaction (-t)
例子
这显示了实例版本库在修订版本40的日志输出:
可跟选项
--revision (-r)
--transaction (-t)
$ svnlook log /tmp/repos/
Rearrange lunch.
11)svnlook tree
打印树。
svnlook tree REPOS_PATH [PATH_IN_REPOS]
打印树,从PATH_IN_REPOS(如果提供,会作为树的根)开始,可以选择显示节点修订版本ID。
可跟选项
--revision (-r)
--transaction (-t)
--show-ids
12)svnlook youngest
打印最年轻的修订版本号。
这显示了在实例版本库显示最年轻的修订版本:
$ svnlook youngest /tmp/repos/
42
2.svnadmin
1)svnadmin hotcopy — 制作一个版本库的热备份。
svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH
2)svnadmin dump — 将文件系统的内容转储到标准输出。
svnadmin dump不会保留修改文件的所有内容,而只是记录修改的部分。
这样减少(有些情况下是非常大的)了svnadmin dump产生的转储文件的大小。
然而,也有缺点—增量转储文件需要更多的CPU来创建,也不可以用svndumpfilter操作,
也不如非增量文件容易被如gzip和bzip2等第三方工具压缩。
转储整个版本库:
$ svnadmin dump /usr/local/svn/repos
SVN-fs-dump-format-version: 1
Revision-number: 0
* Dumped revision 0.
Prop-content-length: 56
Content-length: 56
…
从版本库增量转储一个单独的事务:
$ svnadmin dump /usr/local/svn/repos -r 21 --incremental
* Dumped revision 21.
SVN-fs-dump-format-version: 1
Revision-number: 21
Prop-content-length: 101
Content-length: 101
…
二.hooks简介
钩子脚本在每个repos的hooks目录下面。
每个里面都有模板,名字如下:
post-commit.tmpl post-revprop-change.tmpl pre-commit.tmpl pre-revprop-change.tmpl start-commit.tmpl
post-lock.tmpl post-unlock.tmpl pre-lock.tmpl pre-unlock.tmpl
下面对每个钩子的功用 做一个说明!
1)start-commit — 开始提交的通知
描述
start-commit 在开始事务之前执行。通常用来确定用户是否有提交权限。
如果 start-commit 钩子程序返回非零值,提交就会在创建事务之前停止,stderr 的任何输出都会返回到客户端。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.认证过的尝试提交的用户名
3.Colon-separated list of capabilities that a client passes to the server, including depth, mergeinfo, and log-revprops (new in Subversion 1.5).
2)pre-commit — 在提交结束之前提醒。
描述
pre-commit 钩子在事务创建新版本之前运行。通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。
如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.提交事务的名称
3)post-commit — 成功提交的通知。
描述
post-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。
如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.提交创建的修订版本号
4)pre-revprop-change — 修订版本属性修改的通知。
描述
pre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。
如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.要修改属性的修订版本
3.企图修改属性的认证用户名
4.属性名称已修改
5.变更描述:A (添加的),D (删除的)或M (修改的)
此外,Subversion 通过标准输入将属性的新值传递给钩子程序。
5)post-revprop-change — 修订版本属性修改成功的通知
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.经修改属性的修订版本
3.做出修改的认证用户名
4.属性名称已修改
5.变更描述:A (添加的),D (删除的)或M (修改的)
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。
6)post-revprop-change — 修订版本属性修改成功的通知
描述
post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。
如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.已经修改属性的修订版本
3.做出修改的认证用户名
4.属性名称已修改
5.变更描述:A (添加的),D (删除的)或M (修改的)
此外,Subversion 通过标准输入将属性的前一个值传递给钩子。
7)post-lock — 成功锁定路径的通知。
描述
post-lock 在路径锁定后执行。通常用来发送锁定事件邮件通知。
如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.锁定路径的认证用户名
此外,锁定路径通过标准输入传递给钩子程序,每行一个路径。
8)pre-unlock — 路径解锁尝试的通知。
描述
pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。
如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.Versioned path which is to be unlocked
3.Authenticated username of the person attempting the unlock
9)post-unlock — 路径成功解锁的通知。
描述
post-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。
如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
输入参数
传递给你钩子程序的命令行参数,按照顺序是:
1.版本库路径
2.路径解锁的认证用户名
此外,解锁路径通过标准输入传递给钩子程序,每行一个路径。
三.hooks本应用demo
就是要充分利用2个后台管理命令,以及每个hooks脚本里面传入的参数,进行相关的操作。
1.如果不想开发人员有删除权限,只有SCM用户有删除权限...
#############################################
REPOS="$1"
TXN="$2"
RES="OK"
USER=`svnlook author -t $TXN $REPOS`
SCMLIST="user1,user2,user3" #scm人员列表
if [ `echo $SCMLIST|grep -w $USER|wc -l` -eq 0 ]#如果不是scm操作,就做如下判断
then
SVNLOOK=/usr/bin/svnlook
LOG=`$SVNLOOK log -t "$TXN" "$REPOS"`
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ]
then
echo -e "\n You Don't have the pemmision of delete " 1>&2
exit 1
fi
fi
#############################################
2.提交完毕邮件通知
http://bbs.scmlife.com/thread-14543-1-1.html
见此帖子
3.增量备份
4.在自动编译时,如果某目录正在编译,则禁止开发往该目录提交文件
pre-commit
###############################
REPOS="$1"
TXN="$2"
RES="OK"
st="k2/branch/BR-K2-1_0_001_20100316/"
ABSUSER=$($SVNLOOK author $REPOS -t $TXN)
if [ $ABSUSER != "ads" ]
then
if [ "`echo $files|grep $st`" = "$files" ]
then
echo -e "\n The Path $st Is Being Build Now,Please Commit Later" 1>&2
exit 1
fi
fi
exit 0
###############################
自动构建的脚本 会去sed这个pre-commit里面的st变量。就可以达到类似的效果。
5.钩子脚本 对锁的管理
http://bbs.scmlife.com/viewthread.php?tid=14991&highlight=%2Bgo2cxg
见这个帖子 有详细的说明。
6.禁止新增大于100M的文件入库(为了防止开发提交二进制码入库所做限制)
pre-commit
########################################
REPOS="$1"
TXN="$2"
RES="OK"
MAX_SIZE=10240000
files=$($SVNLOOK changed -t $TXN $REPOS |grep "^A "|awk '{print $2}')
for f in $files
do
filesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c)
if [ $filesize -gt $MAX_SIZE ] ; then
echo "The new add file $f is too large (must <= $MAX_SIZE)" >> /dev/stderr
exit 1
fi
done
########################################
当然 这里还可以做一些其他的限制
比如 你想禁止提交.a 或者 .so的文件入库 都可以在这里做类似的限制