我是理论家:

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. PHP短信发送服务 youe短信企业服务

    /** * 通用短信平台HTTP接口POST方式发送短信实例 * 返回字符串 * 一般情况下调用此方法 */ function postSendMessage($msgContents,$phoneL ...

  2. concurrent实用类

    improt java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.RejectedExecutionHandler; ...

  3. H3C SecPath 防火墙端口回流

    外网IP地址可以通过域名访问内外800端口网站,内网地址不可以,需要做回流 <<内网口.外网口都需要做nat映射>>定义ACL3001acl number 3001rule 0 ...

  4. Xcode 8 控制台输出大量不用的log的问题解决&&NSLog失效的解决

    Product-->Scheme-->editeScheme中:Auguments中Environment Variable中 Scheme中添加环境变量 "OS_ACTIVIT ...

  5. curl的简单使用步骤

    要使用cURL来发送url请求,具体步骤大体分为以下四步: 1.初始化2.设置请求选项3.执行一个cURL会话并且获取相关回复4.释放cURL句柄,关闭一个cURL会话 // 1. 初始化一个cURL ...

  6. C++知识体系

    基础知识 推荐书目 C++ <C++程序设计>(课程教材即可,简而薄) <STL源码剖析>(对C++进一步深化,也是必备知识) <C++对象模型>(经典中经典,重点 ...

  7. php自定义函数求取平方根

    <?phpfunction sqare($a, $left, $right){ $mid = ($left + $right)/2; if($mid * $mid == $a || (abs($ ...

  8. 用myeclipse 创建maven项目时,生成的项目名中总是包含Maven Webapp

    解决办法:新建Maven项目时,展开Advanced-Name template中选择[artifactId]即可

  9. Location-aware Associated Data Placement for Geo-distributed Data-intensive Applications--INFOCOM 2015

    [标题] [作者] [来源] [对本文评价] [why] 存在的问题 [how] [不足] assumption future work [相关方法或论文] [重点提示] [其它]

  10. python_批量修改文件名

    1.在movies文件夹下面的所有文件前面都加上[可可可可] #coding:utf-8 import os movie_name = os.listdir('./movies') for temp ...