该方法仅适用于同步服务器和SVN服务器在同一台机器下,否则无法实现
原理通过在post-commit中运行php代码实现自动update
新建一个php文件
<?php
/**
* SVN 自动同步
*
在svn目录中hooks下新建post-commit文件,并赋予777权限
在文件中调用php命令执行该文件
内容为
/home/tools/tools/php/5.2.17/64/bin/php /home/tuan/jp/svn/hooks/post-commit-sync.php
也可以把输出指向一个文件,不过这样提交时就不会出现出错信息
/home/tools/tools/php/5.2.17/64/bin/php /home/tuan/jp/svn/hooks/post-commit-sync.php>>/????/svn-post-commit-log.txt 2>&1
其中php和svn命令必须用全目录,否则
* 自动根据用户的提交操作,同步文件到Web服务器及另一个SVN版本库
*/
$svnhost = 'svn://localhost:8081/ODPSvn/app'; // 子 SVN 版本库地址
$svnout = '/home/tuan/odp/app'; // 子版本库检出目录
$svnlog = '/home/tuan/jp/svn/log'; // 操作日志文件目录
$svnmast = '/home/tuan/odp/app'; // 主版本库检出目录
/**
*
*
*
* 保存操作日志到文件中
*
*
*
* @param string $logname
* 日志名称
*
* @param string $content
* 日志内容
*
* @return booleam 操作状态
*
*
*/
function save_log_to_file($type, $content)
{
global $svnlog;
if (empty ( $type ) || empty ( $content ))
{
return false;
}
// 生成日志文件名称
$str_log_file = $svnlog . '/svn_log_' . $type . '_' . date ( 'Y-m-d', time () ) . '.txt';
// 组合日志内容
$content = is_array ( $content ) ? implode ( "\n", $content ) : ( string ) $content;
$content = 'svn bot operator date:' . date ( 'Y-m-d H:i:s', time () ) . "\n" . $content . "\n\n";
return file_put_contents ( $str_log_file, $content, FILE_APPEND );
}
// 如果 SVN 输出文件夹不存在就创建一个,登陆失败就退出
if (! is_dir ( $svnout ))
{
if (! @mkdir ( $svnout ))
{
save_log_to_file ( 'slave', 'error:create slave svn output directory faile!' );
exit ();
}
}
// 如果文件夹中没有文件则执行一次 checkout 操作
$filelist = scandir ( $svnout );
if (count ( $filelist ) <= 2)
{
exec ( 'svn checkout ' . $svnhost . ' ' . $svnout );
}
// 如果 checkout 失败则退出程序
if (! is_dir ( $svnout . '/.svn' ))
{
save_log_to_file ( 'slave', 'error:slave svn is not a vaildate work copy!' );
exit ();
}
// 用于保存系统调用的操作结果
$output = array ();
// 开始更新主 SVN 版本库, 避免没有必要的版本冲突
exec ( 'svn update ' . $svnmast, $output );
save_log_to_file ( 'master', $output );
?>
详细内容在注释中都有
至于如何找到所有命令的全目录使用
which +命令
例如
which php
which svn