svn作为一款版本控制工具,本来我只是当做一个仓库来存放代码。但是后来用到web程序的开发,且需要测试发邮件,
必须把代码更新到另一台测试服务器上。没次都需要把代码提交到svn,又要通过putty到工作目录(/opt/test)敲上一遍命令:svn update
感觉实在太麻烦。所以萌生了commit代码时,同步代码到工作目录的念头,这就是SVN的hooks机制!
1.手动命令方式
要了解hooks方式同步代码,我认为首先要了解手动update方式。
比如我的工作目录是/opt/test,首先要从svn仓库checkout一份代码过来。
局域网访问方式:
svn checkout svn://192.168.200.35/test-repo --username svn--password 123456 /opt/test
这样仓库中的源码就以副本的形式存在/opt/test中了
本地PC每次commit修改代码后,
执行:svn update -rm /opt/test
注意,svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本
比如,也可切换到/opt/test目录下,运行命令:
svn update
这样就更新了工作目录的源码。
2. hooks 自动把源码从仓库更新到工作目录
在test-repo版本库中,进入hooks
这里有很多xxx.tmpl的脚本模板,分别定义svn不同时间的一些操作,具体作用请参考
http://www.cnblogs.com/ximu/articles/2119136.html 中"同步更新[钩子]”的部分。
因为我要的是提交代码后,自动更新到工作目录,所以我用的是post-commit.tmpl
在hooks下,
cp post-commit.tmpl post-commit
注意:编辑完成post-commit后,为确保可执行权限,执行:sudo chmod 755 post-commit
vi post-commit
编辑post-commit的内容:
#!/bin/sh
export LANG=en_US.UTF-8
/usr/bin/svn update /opt/test --username svn --password 123456
注意:
/usr/bin/svn是svn命令存放的位置,并不是版本库的路径!
/opt/test是你的工作目录;
username和password是你之前在conf/passwd 中定义的账号名和密码。
这样保存,就可以生效了,并不需要重启svnserve服务。
总结:
现在比较一下hooks自动方式和手动命令方式,update 前面都是svn命令,update后面都是要更新的工作副本。
其实本质上是一样的。
但是,用hooks方式自动更新,由于是svnserve服务来执行,所以运行svnserve的用户必须要对工作副本有读写权限!
比如,我这例子就是:运行svnserve的用户lankou 同时也对/opt/test要有读写权限。
否则会提示"Permision denied"