假如我们在服务器上部署了svn服务,放在 /var/svn/ 文件夹下面,服务器ip假设为 192.168.0.101。
并假如网站与svn仓库都在同一服务器上。
创建一个名为 project1 的项目:
cd /var/svn/ #创建svn仓库 svnadmin create /var/svn/project1 #启动svn仓库命令 svnserve -d -r /var/svn/
从svn中签出项目:
svn co svn://192.168.0.101/project1 /var/www/project1/
post-commit脚本内容,/var/svn/project1/hooks/post-commit:
REPOS="$1" REV="$2" svn update /var/www/project1/ --username [name] --password [pass]
当有开发者向svn服务器提交代码时,就会触发执行 post-commit 钩子脚本,从而执行更新网站目录的命令。
如果我们网站在另一台服务器上,IP为192.168.0.102,那么钩子脚本里面这么写就好:
sshpass -p [password] ssh root@192.168.0.102 "cd /var/www/project1/ && svn update"
sshpass命令可以需要从网站下载后编译安装,用于自动将密码传送给ssh命令。
如果网站目录过大,或一个svn库里面有一大堆项目,那么提交一次的时候,对所有项目都进行svn up操作,显然非常费时。
这时候,就想只对那么有版本变化的文件进行 svn up。
cd /var/www/project1/ svnlook dirs-changed /var/svn/project1 | xargs /usr/bin/svn up -N
上面命令会列出有更新的目录,再更新这些目录。当然这个命令也只适合当网站目录 /var/www/project1/ 和 svn仓库目录 /var/svn/project1 在同一机器上时,如果不在同一机器上,通过svnlook dirs-changed检查哪些目录变化了,再用sshpass 登陆远程主机,只更新这些目录即可。
svnlook help dirs-changed 命令可以查看用法。