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 命令,整个程序寄宿 ...
随机推荐
- 什么是Bash Shell的内建(build in)命令
1.什么是build in命令: shell内建命令是指bash(或其它版本)工具集中的命令.一般都会有一个与之同名的系统命令,比如bash中的echo命令与/bin/echo是两个不同的命令,尽管他 ...
- 页面导入样式时,使用link和@import有什么区别?
1 link属于XHTML标签,而@import是CSS提供的: 2 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载: 3 import只有在IE5以上才能 ...
- Java线程池使用
1.构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit ...
- 定时帧:NSTimer和CADisplayLink
学习参考了:http://www.jianshu.com/p/c35a81c3b9ebhttps://zsisme.gitbooks.io/ios-/content/chapter11/frame-t ...
- Output\TEST.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.
点击错误信息,跳转到了一个.sct文件:*.o (RESET, +First) 按照如下操作,也不能解决问题.对比别的工程,也没找出问题. "操作是: Options for Target ...
- UNICODE与ANSI的区别
什么是ANSI,什么又是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit.(对于字符来说ANSI以单字节存放英文字符,以双字节存放 ...
- setAction方法 Snackbar 右侧按钮可以被点击并处理一些事件
从数据库同一记录取得的字段所组装成的对象应该是同一个对象,然后由不同的Session从数据库同一条记录上分别取得对象,它们的内存地址是不一样的. 一般来说,常见的数字加密方式都可以分为两类,即对称加密 ...
- Android;设置TextView加粗 代码设置
我用过paint的那种方式,不好使. private void setTextBold(TextView textView) { //android中为textview动态设置字体为粗体 textVi ...
- javascript 延时执行函数
延时执行函数,貌似有些多此一举, 也许还是有点用 记在这儿 var test = { delay : function(lifetime){ var data; setTimeout(function ...
- Maze
Maze 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5094 BFS+状态压缩 把身上携带钥匙的状态压缩成一个2^10的整数.这道题难在 ...