該方法僅適用於同步服務器和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