svn hooks的使用demo
我是理论家:
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的更多相关文章
- linux svn hooks代码自动更新至项目
由于开发移动端web,ui需要及时看到样式变化,所以通过svn hooks(钩子)来提交文件,然后再把文件同步到测试服务器项目目录,步骤如下: 1.进入 /home/svn/cmall/hooks ( ...
- php利用svn hooks将程序自动发布到测试环境
利用svn hooks将php程序自动发布到测试环境 复制仓库hooks目录下的post-commit.tmpl为post-commit cp post-commit.tmpl post-commit ...
- 设置SVN hooks实现自动发布
# CentOS下安装SVN yum -y install subversion svnserve --version cd /home/ mkdir svn cd svn/ /usr/bin/svn ...
- SVN Hooks的介绍及使用
阅读此篇文章你可以: 对SVN Hooks有一定的了解 获取两个最常用的SVN Hooks案例 SVN hooks介绍 Hooks 钩子,主要实现的功能就是在特定事件发生之前或者之后自动执行事先定义好 ...
- svn hooks使用
最近要将某个目录做samba共享出去,而想通过svn同步文档到svn,然后通过svn hooks 同步到共享目录,实现自动化 现在svn服务器和samba server再同一台机器上: 在svn路径下 ...
- SVN hooks强制提交时填写日志
#!/bin/bash REPOS="$1" TXN="$2" #svnlook路径 SVNLOOK=/usr/bin/svnlook #通过svnlook获取 ...
- 使用svn hooks 脚本post-commit时遇到的故障
由于网站上线,需要把新添加功能上传到测试环境进行测试,但由于程序员每天有大量的修改,如果总是登陆服务器手动更新svn工作副本(测试环境)太耗时耗精力,进而增加svn进行commit时,测试环境即时更新 ...
- svn hooks post-commit钩子自动部署
#!/bin/sh #修改为服务编码 export LANG=zh_CN.utf- #Set variable REPOS="$1" REV="$2" SVN= ...
- SVN 定时 更新代码 Demo
1. 涉及技术: Winservice: 用system身份后台跑: Quartz:定时任务: SVN 2. 思路: Quartz定时调用cmd 程序,执行SVN update 命令,整个程序寄宿 ...
随机推荐
- sqlmap基础使用
测试许多款 sql注入工具 最终还是发现 sqlmap 最为强悍 谁用谁知道!赶紧抛弃掉手上一大堆 sql 注入工具吧 : )测试环境:ubuntu 10.10 & windows 7(x64 ...
- vim的配置文件参数
环境:kali linux vim的配置文件存放在/etc/vim目录中,配置文件名为vimrc set nocompatible "去掉有关vi一致性模式,避免以前版本的bug和局限&qu ...
- MySQL安装之zip格式
背景: 今天本来想学点JDBC的,没想到在MySQL的安装上卡了很久,特此写下此文,希望大家遇到类似问题可以早些跳出坑. 一.寻找资源 今天,为了学习JDBC,准备在公司的电脑上装MySQL,于是 ...
- EFI Shell 命令说明
EFI Shell 命令说明 引导命令 — EFI Shell 与 nPartition 引导有关的命令. autoboot 设置(查看)自动引导超时变量. bcfg 显示(或修改)驱 ...
- ntp升级
1. 系统与软件版本 1.1 系统版本 CentOS6.5 x86_64 1.2 ntpd软件版本 ntp-4.2.8p9.tar.gz 1.3 下载地址 官方下载地址:http://support. ...
- dotnet的移除-->安装 升级
之所以要升级dotnet 是因为项目中报了如下错误 意思就是版本低了 为了升级 我先要把之前的移除掉(用脚本移除) #!/usr/bin/env bash # # Copyright (c) .NET ...
- asp xml对象转换为string
'xml文件中没有属性的情况 Dim xmlStrxmlStr="<root><count>1</count><error>0</err ...
- 使用vs2010打开VS2013的工程文件
在开发团队,会出现vs工具使用版本的不一样的情况.我的电脑使用的是VS2010,可是其他人员使用的是vs2013. 要打开其他人员上传的工程文件,可以通过三种方式: 1.下载一个vs2013版本. 2 ...
- CMA-连续内存分配
CMA: Contignous Memory Allocator,连续内存分配,一般是分配给Camera,HDMI等使用,避免预留大块内存 1.声明连续内存 使用dma_contignous_rese ...
- OSGI.NET,请求因HTTP状态404 失败:Not Found
在VS里使用OSGI.NET可以正常运行项目和插件,开放工厂远程管理工具也可以使用,没有任何异常.可是,当我把项目部署到IIS上,网站可以正常运行,插件也正常:使用开放工厂远程管理工具时,就出现&qu ...