在本地敲完代码后每次更新到服务器都用用ssh工具更新代码,一来这样更新代码十分繁琐,二来这样做就很难再找到以前的代码了。所以今天就在服务器上搭建了一个svn服务器并做了一个自动更新代码到测试服务器。 1、进入你的svn库中的hooks文件夹,拷贝一份post-commit.tmpl文件:

cp post-commit.tmpl post-commit

2、修改post-commit文件,将文件内容改为:

#!/bin/sh
export LANG=”zh_CN.UTF-8”
#更新到远程的服务器
#/home/xxx/svn.php 为svn.php在svn服务器上的存放地址
/usr/local/php/bin/php /home/xxx/svn.php

3、重新启动svn服务

killall svnserve
svnserve -d -r /home/svn/repositories

3、svn.php代码为

<?php
/**

4、远程服务器update.php文件代码为:

<?php
/**

  • svn服务器上的钩子需要模拟访问的文件,必须是外网可以访问的
  • 存放在远程服务器上
  • /
    error_reporting(E_ALL);
    //设置下字符集,有不认识的字符,也会导致不可更新
    putenv(“LC_CTYPE=zh_CN.UTF-8”);
    //“/home/myweb/“ 为代码更新到的指定目录路径
    $handle = popen(‘svn up –username yourname –password yourpassword /home/myweb/ 2>&1 –no-auth-cache’,’r’);
    //echo “‘$handle’; “ . gettype($handle) . “\n”;
    $read = stream_get_contents($handle);
    //TODO 如果在$read中可以匹配到“error/conflict”,就应该发送邮件到管理员的邮箱了!
    echo $read;
    pclose($handle);

5、在update.php文件中–no-auth-cache比较重要,如果没有该参数则会出现错误:———————————————————————– ATTENTION! Your password for authentication realm: /home/svn/repositories can only be stored to disk unencrypted! You are advised to configure your system so that Subversion can store passwords encrypted, if possible. See the documentation for details. You can avoid future appearances of this warning by setting the value of the ‘store-plaintext-passwords’ option to either ‘yes’ or ‘no’ in ‘/sbin/.subversion/servers’. ———————————————————————– Store password unencrypted (yes/no)? svn: Can’t read stdin: End of file found 6、在使用之前记得对服务器要更新的目录先做一次检出

svn co svn://115.28.39.17/ aaa

如果出现错误;则是因为检出时使用的root权限,而web访问则是没有权限的 svn: Can’t open file ‘/home/web/svn/myweb/aaa/115.28.39.17/.svn/lock’: Permission denied 解决方法

chmod o+w aaa/.svn -R