SVN自動同步方法

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章