文档章节

SVN hooks(钩子)- 简单入门

添仔哥哥
 添仔哥哥
发布于 2017/07/23 13:16
字数 1196
阅读 25
收藏 1
点赞 0
评论 0

by addy 原创文章,欢迎转载,但希望全文转载,注明本文地址。

本文地址:http://www.iamaddy.net/2014/04/svn-hooks%ef%bc%88%e9%92%a9%e5%ad%90%ef%bc%89-%e7%ae%80%e5%8d%95%e5%85%a5%e9%97%a8/

在做版本的时候,需要SVN做一些自动化的事情,比如提交前自动更新;提交一些文件后关联着提交另一些。所以需要写一点自动化脚本。

什么是SVN钩子

官方说法:

钩子是通过版本库事件触发,例如新版本的创建或一个未版本化属性的修改。一些钩子(叫做“pre hooks”)在事件发生前运行,可以用来报告发生了什么以及防止它发生。还有一些钩子(“post hooks”)在版本库事件之后发生,只是用来报告。每个钩子能够获得事件的足够信息,例如提出的(或完成的)版本库修改细节,还有触发事件的用户名。

分类

  • 服务器钩子:

经常提到的svn hooks是一组“外挂”脚本程序,是svn提供的一组由svn事件触发的特别有用的程序。这些程序在服务器端执行,可以提供svn之外的一些附加功能。钩子可以调用批处理文件、可执行文件或者一些类似于perl、python等的脚本。

  • 客户端钩子:

如果使用tortoise svn(海龟svn,常用的svn客户端),它也提供钩子机制,这些和svn hooks有本质区别,它是在本地(客户端)执行的。

如何使用客户端钩子

鼠标右键—>TortoiseSVN—>设置

SVN hooks(钩子)- 简单入门

svn钩子配置

执行顺序

上图的hook type有六种,前三个是提交,后三个是更新。

执行顺序从上到下。即:

start Commit Hook -> Pre commit hook -> post commit hook

Start commit hook -> Pre update hook -> Post commit hook

编写hooks可以使用多种语言和脚本,我对js比较熟悉,所以选择JScript,即简单又功能强大。

如何运行JScript脚本

 

SVN hooks(钩子)- 简单入门

svn钩子配置

点击add.. ,working copy path命令的执行路径,command line to execute 待执行的脚本。

温馨提示:对于JScript脚本,调用命令中必须使用wscript,否则脚本无法运行,如图示。

如何写脚本

Js语言不多说,那说说window中执行js脚本的一些问题。

WScript对象是在window中特有的对象,全称“Windows Scripting Host”,是一种批次语言/自动执行工具——它所对应的程序“wscript.exe”是一个脚本语言解释器。

  • WScript.echo

相当于alert,调试用。

  • WScript.shell

执行命令,如:svn update filepath、svn commit filepath

var oShell = new ActiveXObject('WScript.Shell');
oShell.Run("cmd.exe /k svn mkdir D:\\mgp_proj\\trunk\\test2", 1, true);


cmd /c dir 是执行完dir命令后关闭命令窗口。

cmd /k dir 是执行完dir命令后不关闭命令窗口。

这样一来就能查看运行结果了,方便调试。

读文件

var fso = new ActiveXObject('Scripting.FileSystemObject');
var readme = cwd + '//readme.txt';
if (fso.FileExists(readme)) {
// 使用当前系统默认的编码方式(ANSI)读取文本文件
var ts = fso.OpenTextFile(readme, 1, false);
var text = ts.ReadAll();
ts.Close();
})


温馨提示:fso.FileExists(readme) 文件存在返回-1 ,不存在返回0

写文件

var stream = new ActiveXObject('Adodb.Stream');
stream.Mode = 3; // read/write
stream.Open();
stream.Type = 2; // text
stream.Charset = 'utf-8';
stream.WriteText('hello world');
stream.SaveToFile('readme.txt', 2); // overwrite
stream.Close();


svn的临时文件

在我们提交文件时,svn会在系统的临时目录生成一些关于提交文件的属性的文件,以post-commit-hook为例子:

  • 参数1临时路径名
  • 参数2 文件数
  • 参数3临时路径名
  • 参数4 版本号码
  • 参数5 临时路径名
  • 参数6 当前提交路径

这样一来可以拿到提交的文件列表,方便做相应的处理,不同命令对应的参数不同,自己写代码去调试吧。这样来取得参数:

var args = WScript.Arguments; // 钩子脚本被调用时,由TSVN传入的参数

一些参考

  • 关于window下cmd执行SVN命令

http://blog.csdn.net/gwzz1228/article/details/7840666

http://stackoverflow.com/questions/8505228/javascript-svn-wrapper

http://blog.sina.com.cn/s/blog_4f925fc30102ehph.html

http://blog.itpub.net/14466241/viewspace-713138/

http://www.wikihow.com/Get-Started-With-Command-Line-Subversion-on-Windows

  • 在命令行运行JScript脚本时,遇到如下的错误提示:

“输入错误: 没有文件扩展“.js”的脚本引擎。”

只需要把[HKEY_CLASSES_ROOT\.js] 项下的那个默认值改成 ”JSFile” 就可以正常运行JS 文件了。

 

做这个调了很久,毕竟感觉参考的文档少,所以写出来以供大家参考。

 

本文为原创文章,可能会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,谢谢合作

本文地址:http://www.iamaddy.net/2014/04/svn-hooks%ef%bc%88%e9%92%a9%e5%ad%90%ef%bc%89-%e7%ae%80%e5%8d%95%e5%85%a5%e9%97%a8/

本文转载自:http://www.iamaddy.net/2014/04/svn-hooks%ef%bc%88%e9%92%a9%e5%ad%90%ef%bc%89-%e7%ae%80%e5%8d%95%e5%8

共有 人打赏支持
添仔哥哥
粉丝 3
博文 105
码字总数 41550
作品 0
广州
程序员
CentOS6.2 64位部署lampp+svn配置钩子

在某云购置了一台新服务器作为项目测试和部署用 以后资料都是网上搜集整理后测试过的!实在太多乱78遭的文章,还是自己整理一份备份好; #Setup 1 安装lampp 这个很简单,直接从官方下载一个...

尐桀
2014/04/02
0
1
linux系统安装和使用SVN经验和遇到的问题

系统里已经安装上了svn服务 新建文件 在新建的文件里面建立一个版本库 版本库的配置 重启svn服务 初充一:若想达到客户端提交文件,服务器下某个目录(假如目录名为html)也同步自动更新,采用下面...

砰砰砰砰
2015/08/29
0
0
SVN 配置自动更新WEB服务器

SVN 配置自动更新WEB服务器 最近有个小项目,需要用SVN来进行版本控制。 项目组的同僚有8个人,大家都在本地开发,然后提交到服务器——服务器就是其中一台机器。专门安排一个测试员来进行项...

真座山雕
2012/11/09
0
0
SVN版本管理与代码上线架构方案

SVN是Subversion的简称,是一个开放源代码的版本控制系统,可以超越时间的管理文件和目录。文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可...

linuxzkq
06/26
0
0
Windows下Subversion配置管理员指南

from: http://www.uml.org.cn/pzgl/200611151.htm //============================ Subversion安装成service  以前的svnserve要想成为windows服务,必须依赖于svnservice或其他工具。从Sub......

jia程序员
2009/05/15
0
0
Puppet系列之三:Puppet结合SVN实现版本的集中化备份与恢复

1 概述 通过安装部署Puppet C/S模型,实现Puppet Server端管理所有被控制机的整个生命周期:从初始化到软件升级、从配置文件创建到测试部署、从系统维护到服务器迁移等。Puppet能够持续化的与...

guzhoujiexing
06/26
0
0
SVN各种错误提示产生原因及处理方法大全

SVN各种错误提示产生原因及处理方法大全 1. svn: Server sent unexpected return value (500 Internal Server Error) in response to OPTIONS request for 'http://svn.moon.ossxp.com/svn/......

诺灬晓月
2014/09/12
0
1
利用SVN的post-commit钩子实现多项目自动同步

svn的post-commit钩子脚本在每次提交(commit)之后运行,我们可以在这个脚本里实现一些比较实用的功能,比如发送邮件提醒、自动备份版本库,自动同步代码到web服务器等。 这里用post-commit...

ning235
06/26
0
0
SVN 使用hooks 自动更新到远程的web目录下

环境: A机器192.168.1.10 作为SVN的服务端 (环境 apache svn ssh) 环境: B机器 192.168.1.20 (环境 nginx php ssh svn 作为客户端) 目的:开发人员上传代码到A机器时, 会自动更新到B机器上ngi...

求学ing
2013/09/24
0
3
Ubuntu下SVN安装和配置

一、SVN安装 1.安装包 1.$ sudo apt-get install subversion 2.创建项目目录 $ sudo mkdir /home/xiaozhe/svn $ cd /home/xiaozhe/svn/ $ sudo mkdir mypro 3.创建svn文件仓库 $ sudo svnad......

charley158
2013/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mybatis拦截器之数据权限过滤与分页集成

需求场景 最近项目有个数据权限的业务需求,要求大致为每个单位只能查看本级单位及下属单位的数据,例如:一个集团军下属十二个旅,那么军级用户可以看到所有数据,而每个旅则只能看到本旅部...

佛系程序猿灬
11分钟前
0
0
Vue作为MVVM框架,M、V、VM分别代表什么?

<script src="vue.js"></script><div id="demo"> {{message}} <input v-model="message"></div><script> var vm = new Vue({ el: '#demo', data: { mes......

JamesView
14分钟前
0
0
SpringCloud 微服务 (十六) 服务追踪 Zipkin

问题 在服务中,有一个接口,该A接口中又调用了其他服务的B、C、D接口,出现一个请求耗时大的问题,这时候并不知道该B、C、D接口中哪个接口造成的耗时量,然后比如确定C服务接口出现的耗时量大,但...

___大侠
55分钟前
0
0
Java面试基础篇——第八篇:抽象类与接口的区别

1.抽象类 抽象类:如果一个类中包含有抽象方法,或这个类使用abstract关键字修饰,则称这个类是抽象类。 抽象方法是什么呢?抽象方法就是指用abstract关键字修饰的方法。 需要注意的是:抽象...

developlee的潇洒人生
今天
2
0
jsoup 相关资料

1.jsoup 2.Jsoup概述 3.jsoup入门 4.jsoup Java HTML Parser 1.11.3 API

IT追寻者
今天
0
0
JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
今天
0
0
【一】Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
3
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部