资料:http://www.worldhello.net/doc/svn_hooks/svn_hooks.mm.htm
    http://gongwen.sinaapp.com/article-132.html

    1. 出于公司开发部需要svn同步更新服务器代码,需要用到svn钩子(hooks)技术,以前从来没听过,没办法只能google了,google半天再一次认同了一个道理:天下文章一大抄啊,东拼西凑终于算是完成了(为啥说算是呢?svn太强大了我所做的只是一点点),不多说了,上例子:

    我们公司的部署很简单(svn服务和web服务在同一台主机上):
    开发 ——- svn(存储)—— 线上服务器

    以前是这样(没有用到hooks时):
    开发部commit一个文件,线上服务的web文档并不同步,而是需要在svn服务上执行
    svn update命令后才能同步。
    现在是这样(用到hooks后):
    开发部commit一个文件,线上服务(web目录)同步数据,不需要svn update命令了,这样就减少了中间的一个小繁琐,别看这只是一个小动作但是省了一大麻烦(对于web开发工程师来说尤其这样,你想啊,代码经常改,还得经常svn update,总是一件事来回来回,烦不烦啊,是吧!)

    我们需要同步的网站目录是(当然之前在svn服务器上已经存有assets目录文件了):
    钩子(hooks) - 图1
    这样就先在webdir目录下建立一个assets目录(记得切换到webdir目录下),并运行
    钩子(hooks) - 图2运行完这条命令后在webdir下面就检出了svn服务器上的assets目录了(里面有网站文件),这样做就相当于把web目录做成客户端目录了;

    那么怎么利用hooks实现数据同步呢?接下来
    钩子(hooks) - 图3
    看到了绿色文件了吗?!这里面其实就是一个shell脚本:
    钩子(hooks) - 图4
    其中的DIR变量存着需要同步的目录,利用svn update命令加上用户名、密码就能同步了(我做的也就只能这么简单,莫怪兄弟啊!),主要看上幅图,有很多.tmpl结尾的文件,这些就是hooks模板了,post-commit这个文件名不要更改(需要给它执行权限)

    经过这几步后,不需要手动执行这个post-commit脚本就可以完成开发部所需要的要求了!

    post-commit
    在提交完成,成功创建版本之后执行该钩子,提交已经完成,不可更改,因此本脚本的返回值被忽略。
    post-lock
    对文件进行加锁操作之后执行该脚本
    post-revprop-change
    在修改 revision 属性之后,执行该脚本。因为修改稿已经完成,不可更改,因此本脚本的返回值被忽略(不过实际上的实现似乎是该脚本的正确执行与否影响属性修改)
    post-unlock
    对文件进行解锁操作之后执行该脚本
    pre-commit
    在 Subversion transaction 完毕之后,在提交之前,执行该脚本
    pre-lock
    对文件进行加锁操作之前执行该脚本
    pre-revprop-change
    在修改 revision 属性之前,执行该脚本
    pre-unlock
    对文件进行解锁操作之前执行该脚本
    start-commit
    在客户端还没有向服务器提交数据之前,即还没有建立 Subversion transaction(缩写为 txn) 之前,执行执行该脚本

    具体到我们的应用场景,我们要实现一个同步的测试服务器,我们只需要在一个用户执行完毕一个commit提交操作之后,让钩子程序去自动更新测试服务器的文件即可!

    附上我所做的svn目录介绍:

    192.168.1.20就是我们公司内部服务器了(svn+web),svn的根目录就是svndate(svndate就是版本目录了,直接用svn客户端访问192.168.1.20就行)
    钩子(hooks) - 图5
    他的auth文件是(这样就能看出来svndate就是根目录了,注意document目录,前面的图里面出现过):
    钩子(hooks) - 图6