我是理论家:

svn server端提供了Hooks Script。所谓钩子实际上是一种时间触发机制,是指当系统执行到某个特殊的事件时,触发我们预定义的动作,可以让我们在某些特定状态发生的时候做我们想做的事。同时,钩子可以调用shell、批处理文件或者perl、python、ruby等脚本。

那么Svn的Hooks 在哪里呢?

进入一个svn的代码仓库,在仓库目录下有一个Hooks的目录,进入该目录,正常情况下,你应该看到的是下图(每一个Repo对应一个hooks目录

·

.tmpl是每个hooks的模板文件,其实都是文本文件,使用vim打开后,可以看到里面的注释和详细的说明,这些是我们可以使用的第一手的帮助文件。

如上图svn服务端有9种钩子,分别是:

A.关于锁定的2种
a1.pre-lock
a2.post-lock
B.关于解锁的2种
b1.pre-unlock
b2.post-unlock
C.关于提交的3种
c1.start-commit
c2.pre-commit
c3.post-commit

顺序是:c1---->c2----->c3

D.关于属性的2种
d1.pre-revprop-change
d2.post-revprop-change

需要特别注意的是:为安全起见,svn执行脚本的环境变量为空(连PATH环境变量都木),所以你需要使用绝对路径或者定义PATH环境。

pre-lock:在每次有人尝试锁定文件时执行。可以防止完全锁定,或者用来创建控制哪些用户可以锁定哪些路径的复杂策略。如果钩子发现已存在锁,也可以决定是否允许用户“窃取”这个锁。

post-lock:在路径锁定后执行。通常用来发送锁定事件邮件通知。

pre-unlock:在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。

post-unlock:在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。

start-comint:开始提交事务前调用,通常用来判定一个用户是否有权提交。同时传入三个参数,第一个是提交的Repository的路径(服务器端的实际路径),第二个是尝试提交的用户名,第三个是一些capabilities信息,是在1.5 version中新加入的,建议是不使用。

pre-commit:在事务完成提交之前运行,同时传两个参数进去,一个就是提交的Repository的路径(服务器端的实际路径),第二个是TXN-Name.(Transaction Name),这个是用于标识此提交进程的事务ID。

post-commit:它在事务完成后运行,创建一个新的修订版本。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者作为版本库的备份。版本库传给程序两个参数:到版本库的路径和被创建的新的修订版本号。退出程序会被忽略。

pre-revprop-change:因为Subversion的修订版本属性不是版本化的,对这类属性的修改(例如提交日志属性svn:log)将会永久覆盖以前的属性值。因为数据在此可能 丢失,所以Subversion提供了这种钩子(及与之对应的post-revprop-change),因此版本库管理员可用一些外部方法记录变化。作为对丢失未版本化属性数据的防范,Subversion客户端不能远程修改修订版本属性,除非为你的版本库实现这个钩子。

post-revprop-change:这个钩子与pre-revprop-change对应。事实上,因为多疑的原因,只有存在pre-revprop-change时这个脚本才会执行。当这 两个钩子都存在时,post-revprop-change在修订版本属性被改变之后运行,通常用来发送包含新属性的email。版本库传递四个参数给该 钩子:到版本库的路径,属性存在的修订版本,经过校验的产生变化的用户名,和属性自身的名字。

下面来点实战:

Question1:实现一些白名单之类的功能,只有在某个文件里用户才能提交到svn。

由于是在提交之前做一写工作,这里需要用到start-commit这个hooks,通过对比start-commit传入的用户这个参数和白名单里的用户,来判断是否准入。

代码如下:

#!/bin/bash

# START-COMMIT HOOK
#
# The start-commit hook is invoked before a Subversion txn is created
# in the process of doing a commit. Subversion runs this hook
# by invoking a program (script, executable, binary, etc.) named
# 'start-commit' (for which this file is a template)
REPOS="$1"
USER="$2" BLACKLIST_FILE="$REPOS/hooks/BLACK_LIST"
# check if the user is in the black list
#commit-allower.pl --repository "$REPOS" --user "$USER" || exit
#special-auth-check.py --user "$USER" --auth-level || exit
if [ -s $BLACKLIST_FILE ]; then
(grep -v "^#" $BLACKLIST_FILE | grep -iwq $USER ) || exit
#exit
fi
# All checks passed, so allow the commit.
exit

这里用到了一些shell的知识,关于shell的坑,以后再总结。

Question2:强制svn的提交者必须输入对应的log,我们就需要pre-commit这个hooks。

接下里重命名pre-commit.tmpl为pre-commit,并同时给该文件可执行权限(很重要,我就是这里忘记了,排错了好久,不然脚本执行后会显示不知所云的错误信息:svn: Commit blocked by pre-commit hook (exit code 255) with no output。)

修改pre-commit文件内容如下:

#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ "$LOGMSG" -lt (要求的log长度,依实际需要修改) ];
then
echo -e "nEmpty log message not allowed. Commit aborted!" >&
exit
fi
# All checks passed, so allow the commit.
exit

不用重启svn,再提交代码时,就必须按要求写注释了。

Tips:

1,配置完成之后一定要给对应的*-commit加上可执行权限,否则会出现如图所示错误。

,

2,使用post-commit的时候要慎重,因为整个操作不能保证原子性。

svn hooks的使用demo的更多相关文章

  1. linux svn hooks代码自动更新至项目

    由于开发移动端web,ui需要及时看到样式变化,所以通过svn hooks(钩子)来提交文件,然后再把文件同步到测试服务器项目目录,步骤如下: 1.进入 /home/svn/cmall/hooks ( ...

  2. php利用svn hooks将程序自动发布到测试环境

    利用svn hooks将php程序自动发布到测试环境 复制仓库hooks目录下的post-commit.tmpl为post-commit cp post-commit.tmpl post-commit ...

  3. 设置SVN hooks实现自动发布

    # CentOS下安装SVN yum -y install subversion svnserve --version cd /home/ mkdir svn cd svn/ /usr/bin/svn ...

  4. SVN Hooks的介绍及使用

    阅读此篇文章你可以: 对SVN Hooks有一定的了解 获取两个最常用的SVN Hooks案例 SVN hooks介绍 Hooks 钩子,主要实现的功能就是在特定事件发生之前或者之后自动执行事先定义好 ...

  5. svn hooks使用

    最近要将某个目录做samba共享出去,而想通过svn同步文档到svn,然后通过svn hooks 同步到共享目录,实现自动化 现在svn服务器和samba server再同一台机器上: 在svn路径下 ...

  6. SVN hooks强制提交时填写日志

    #!/bin/bash REPOS="$1" TXN="$2" #svnlook路径 SVNLOOK=/usr/bin/svnlook #通过svnlook获取 ...

  7. 使用svn hooks 脚本post-commit时遇到的故障

    由于网站上线,需要把新添加功能上传到测试环境进行测试,但由于程序员每天有大量的修改,如果总是登陆服务器手动更新svn工作副本(测试环境)太耗时耗精力,进而增加svn进行commit时,测试环境即时更新 ...

  8. svn hooks post-commit钩子自动部署

    #!/bin/sh #修改为服务编码 export LANG=zh_CN.utf- #Set variable REPOS="$1" REV="$2" SVN= ...

  9. SVN 定时 更新代码 Demo

    1. 涉及技术: Winservice: 用system身份后台跑:  Quartz:定时任务:  SVN 2. 思路: Quartz定时调用cmd 程序,执行SVN update 命令,整个程序寄宿 ...

随机推荐

  1. Linux_jdk

    先查看下 yum list java* yum install java-1.7.0-openjdk* -y 环境变量应该是会自动配置的 或者手动配置编辑/etc/profile #vi /etc/p ...

  2. BAPI_GOODSMVT_CREATE 移动类型201 CODE = '03' 代码

    DATA: MAT_DOC LIKE BAPI2017_GM_HEAD_RET-MAT_DOC.      "物料凭证编号   DATA: GMHEAD LIKE BAPI2017_GM_H ...

  3. freemarker + spring mvc + spring + mybatis + mysql + maven项目搭建

    今天说说搭建项目,使用freemarker + spring mvc + spring + mybatis + mysql + maven搭建web项目. 先假设您已经配置好eclipse的maven ...

  4. jquery学习笔记3 jq遍历

    遍历方式:向上(父级元素)  向下(子元素)    水平(同胞元素) 一.向上遍历 parent()      向上一级   放回被选元素的直接父元素 parents()          返回被选元 ...

  5. 博客word测试

    博客word测试 博客word测试 from __future__ import division, print_functionDOCLINES = (__doc__ or '').split(&q ...

  6. openstack私有云布署实践【6 RabbitMQ】

    生产环境建议在集群三台controller上做rabbitmq 使用到队列的openstack组件 OpenStack Compute OpenStack Block Storage OpenStac ...

  7. MySQL设置binlog日志的有效期自动回收

    设置日志保留天数,到期后自动删除 查看当前日志保存天数: show variables like '%expire_logs_days%'; 默认是0,即永不过期. 通过设置全局参数修改: set g ...

  8. IOS开发小技巧,知识点

    1.IOS模拟器第一次打开需要进入“设置”中关掉"Auto-Capitalization"选项. 2.NSInteger转化 NSString类型: [NSString strin ...

  9. peepingtom

    简介 辅助评判网页渗透价值的自动化工具.它可以对制定IP和指定端口的所有http(s)服务进行快照,以一种易于浏览阅读的方式展示出来. 安装 git clone https://bitbucket.o ...

  10. Spring Security(09)——Filter

    目录 1.1     Filter顺序 1.2     添加Filter到FilterChain 1.3     DelegatingFilterProxy 1.4     FilterChainPr ...