欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SVN Hooks 脚本 start-commit pre-commit post-commi svnHooks脚本 

程序员文章站 2022-03-12 23:40:24
...
钩子脚本无非是利用后台的管理命令和所需要使用的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的文件入库 都可以在这里做类似的限制
相关标签: svn Hooks脚本