`

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

阅读更多
钩子脚本无非是利用后台的管理命令和所需要使用的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钩子 之 pre-commit

    1. 将`pre-commit.bat`或`pre-commit.exe`放置在SVN服务器的`hooks`目录下。 2. 确保脚本有执行权限。 3. 根据项目需求,编辑脚本内容,定义需要在提交前执行的操作。 4. 测试钩子,确保它按预期工作,并不会阻断...

    SVN钩子脚本pre-commit实现删除权限控制

    在SVN仓库的`hooks`目录下创建`pre-commit`脚本: ```bash [root@localhost conf]# cd /var/www/repos/testsvnproj/hooks/ [root@localhost hooks]# vi pre-commit ``` 脚本示例内容: ```bash #!/bin/sh REPOS=...

    svn hook pre-commit禁止删除文件和强制添加注释

    例如,`pre-commit` 脚本会在提交之前执行,而 `post-commit` 脚本则在提交之后运行。这些脚本为管理员提供了额外的灵活性,以便根据项目的需求自定义SVN的行为。 #### 三、pre-commit脚本的作用 pre-commit 脚本...

    windows下svn的pre-commit钩子

    用法:将本bat文件(不可改名)存在svn服务器端安装目录\仓库名\hooks下(该目录下有多个*.tmpl文件,包括pre-commit.tmpl即linux下的提交钩子,而pre-commit.bat为windows下的提交钩子),并修改文件中相应目录(共...

    解决SVN:post-commit hook failed (exit code 127) with output:

    (1)在网上看了很多方案,类似于 在 hooks文件的 post-commit 文件中增加 || exit1 exit0;这种方案试过之后并没有解决问题; (2)最终解决方案,找到post-commit 文件的第52行,并把相应内容注释掉,问题得到了...

    subversion中的pre-commit.bat

    这些操作称为 Hook SCRIPT,其中包括 pre-commit、post-commit、pre-update、post-update 等多种类型的 Hook,每种 Hook 都有其特定的用途和执行时机。 在 Subversion 中,pre-commit Hook 是在客户端提交事务之前...

    pre-commit.bat

    windows环境svn服务器,提交限制文件大小脚本,pre-commit.bat,限制大小为byte

    post-commit.rar

    标题“post-commit.rar”指的是一个与版本控制系统Subversion(简称SVN)相关的压缩包文件,其中包含用于自动化操作的脚本和配置。这个压缩包很可能是一个示例或模板,用于在执行提交操作后触发特定的行动,比如发送...

    svn hooks 全集,包含常用示例代码

    通常,hooks 脚本位于 SVN 仓库的 `hooks` 目录下,每种类型的 hook 都有一个对应的脚本文件,如 `pre-commit.sample`、`post-commit.sample` 等。你需要根据自己的需求修改这些样本脚本,然后去掉 `.sample` 扩展名...

    VisualSVN的pre-commit文件

    配置VisualSVN时设置pre-commit要求输入说明

    SVN服务端(VisualSVN-Server-3.9.0-x64)

    SVN服务端(VisualSVN-Server-3.9.0-x64) SVN服务端(VisualSVN-Server-3.9.0-x64) 直接使用

    svn提交文件自动邮件提醒

    `commit-email.pl` 是一个Perl脚本,通常作为SVN服务器的post-commit钩子,当用户提交代码到SVN仓库后,该脚本会被触发,然后自动发送一封包含提交详情的邮件给指定的收件人。这不仅提高了团队协作效率,也确保了...

    svn-win32-1.4.6.zip

    在“svn-win32-1.4.6.zip”这个压缩包中,我们可以看到的是适用于Windows操作系统的SVN客户端版本1.4.6。 1. **SVN的原理**: SVN基于集中式版本控制模型,所有的版本信息存储在一个中央服务器上,开发者通过...

    Android代码-maven-git-commit-id-plugin

    maven git commit id plugin git-commit-id-plugin is a plugin quite similar to ...

    svn-win32-1.7.2.zip (win32svn) [SVN 绿色版]

    将文件解压缩到 C:\ 下,将解压缩后的 svn-win32-1.7.2 文件夹名改为 svn,然后将 C:\svn\bin 加入到系统的 PATH 环境变量中,即可开始使用。 将 svnserve.exe 设置为系统服务: sc create svn binpath= "C:\svn\...

    post-commit.bat

    SVN提交时必须写说明,说明少于10个字符则提交失败 把改文件放在SVN的hooks目录下,并修改一些文件里的路径即可

    Eclipse SVN插件(svn-site-1.6.17)

    在本文中,我们将深入探讨Eclipse SVN插件(svn-site-1.6.17)及其相关组件,以帮助您更好地理解和使用这个强大的版本控制系统。 首先,Eclipse SVN插件提供了图形化的用户界面,使得用户可以方便地进行版本控制...

    SVN-x64-svn-2017-10-31 104600_Hcs.zip

    【标题】"SVN-x64-svn-2017-10-31 104600_Hcs.zip"所指的是一个64位版本的Subversion(SVN)软件的压缩包,发布于2017年10月31日,版本号为104600,由Hcs提供。这个压缩包中包含了一个名为"SVN-x64-svn-2017-10-31 ...

    windows下在svn钩子中获取,项目名称,作者,日志,时间,版本号

    在windows环境下,提交代码到svn中,使用钩子脚本,获取项目名称,提交人,提交时间,提交的日志信息,版本号,纯bat脚本。ps:不是pre-commit.bat文件,因为在该文件中获取不到真正的版本号。

    svn-win32-1.7.0.zip (Win32Svn)

    将文件解压缩到 C:\ 下,将解压缩后的 svn-win32-1.7.0 文件夹名改为 svn,然后将 C:\svn\bin 加入到系统的 PATH 环境变量中,即可开始使用。 将 svnserve.exe 设置为系统服务: sc create svn binpath= "C:\svn\...

Global site tag (gtag.js) - Google Analytics