SVN commit提交后自动同步服务器代码,这可是个技术细节啊!但是,没关系,我会尽力简单明了地解释给你听。
一、创建钩子
首先,当你在SVN上做了commit提交后,你希望服务器上的代码也能自动更新,对吧?那么,我们可以借助一个叫做"钩子"的特性来实现这个自动同步的过程。 该文件默认在仓库地址/hooks目录下,初始名称为pre-commit.tmpl。 复制该文件名称为pre-commit 使其生效
shell
#!/bin/sh
export LANG=en_US.UTF-8
REPOS="$1"
REV="$2"
LOG_FILE=/alidata/log/svn/svn_linlic_$REV.log #记录提交日志
changed=$(svnlook changed -r $REV $REPOS) # 比较改变的文件
echo "$changed" >> $LOG_FILE
#/usr/bin/php /alidata/www/svn_post_commit_linlic.php #执行php脚本
二、编写钩子业务逻辑 执行同步
核心思想:读取日志文件->执行同步命令,为避免大批量提交的日志拖垮更新进程,可使用更新目录的模式。
php
//读取日志文件
date_default_timezone_set('Asia/Shanghai');
function writelog($text){
file_put_contents ( "写你自己的"."/".date('Y-m-d').".txt", "【".date ( "H:i:s" ) . "】\r\n \t" . $text . "\r\n", FILE_APPEND );
}
while(true){
$wenjians = scandir('你的svn日志目录');
unset($wenjians[0]);unset($wenjians[1]);
if (empty($wenjians)){continue;}
$svnlist = ['cs1','cs2'];//仓库项目列表
foreach ($wenjians as $key => $val) {
$f = file_get_contents("你的svn日志目录"."/".$val);
$files = explode("\n", $f);
if (!is_array($files)) {
$files=(array)$files;
};
$filelist = [];
foreach ($files as $vf) {
$vf = trim(substr($vf, 2));
$dirname = dirname($vf);
$filelist[$dirname] = $dirname;
}
$log_arr = [];
foreach ($filelist as $v) {
$document_root = '你的目录';
$behindfile =strstr($v,'/');
$d_tem = explode('/',$v)[0];
if (!in_array($d_tem,$svnlist)){
if($d_tem){
unlink("/alidata/log/svn"."/".$val);
writelog("【{$val}】"."非同步项目删除");
}
continue;
}
$d_tem=='cs1' && $document_root.='/仓库地址1';
$d_tem=='cs2' && $document_root.='/仓库地址2';
$cmd = "svn update --username 用户名 --password 密码 {$document_root}{$behindfile}";//
// //执行svn命令
$res ='';
exec($cmd,$res);
$log_arr[]= $res;
//SVN 处理 不更新问题
if(!(strpos(end($res),'revision') !== false)){
$res2=$res3='';
$cmd2 = "svn cleanup --username 用户名 --password 密码 {$document_root}";
exec($cmd2,$res2);
writelog("【{$val}】"."执行了cleanup".json_encode($res2));
sleep(60);
exec($cmd,$res3);
writelog("【{$val}】"."执行了cleanup后 再次up".json_encode($res3));
}
sleep(3);
}
if(empty($log_arr)){
continue;
}
writelog("【{$val}】"."更新文件成功".json_encode($log_arr));
// //删除日志文件
sleep(5);
unlink("/alidata/log/svn"."/".$val);
writelog("【{$val}】"."日志文件删除成功");
}
sleep(5);
}
通过这种方式,你就可以轻松地实现SVN commit提交后自动同步服务器代码的需求啦!不用手动操作,代码就会像调皮的小精灵一样,在服务器上自己找到合适的位置落脚。真是方便又省心啊!
当然,这只是其中一种方法,根据你的实际情况可能还有其他更适合的方式。如果你需要更详细的指导,我还可以为你提供更多的信息。希望这篇解释能给你带来帮助!快去试试吧,让咱们的代码自动起舞吧!