SVN版本库中的一个项目:/svn/repositories/test/

网站目录:/web/test/

1、现将SVN版本库中的一个项目checkout到网站目录

  • svn co file://svn/repositories/test/ /web/test/

 

2、简单同步更新思想

做法:通过检测svn提交,服务器更新固定目录,达到同步更新的目的。

优点:简单快捷

缺点:每次同步都需要更新整个目录,项目一多就容易卡,更新缓慢。

步骤如下:

  • 新建一个post-commit钩子
  • vim /svn/repositores/test/hooks/post-commit
  • 添加以下代码:
  • #!/bin/sh
  • REPOS="$1"
  • REV="$2"
  • export LANG="zh_CN.UTF-8"    #防止乱码
  • #设置登陆账号密码并不缓存
  • svn update /web/test/ --username 帐号 --password 密码 --no-auth-cache

注意事项:

  • 不要遗漏第一行的#!/bin/sh,否则post-commit会报代号255的错误,保存后,修改文件权限为755,否则SVN无法调用执行,这是一个比较安全的做法;
  • 或者直接修改post-commit的权限为777,可省略#!/bin/sh;
  • 文件权限修改:chmod 755 /svn/repositores/test/hooks/post-commit

 

3、同步更新优化思想

做法:通过检测svn提交,来获取具体的更新目录或文件路径,对应更新,达到优化的   目的。

优点:可大量缩短提交更新的时间

缺点:需调用php的exec函数,降低安全性

步骤如下:

新建一个post-commit钩子

  • vim /svn/repositores/test/hooks/post-commit

添加如下代码:

  • #!/bin/sh
  • export LANG=en_US.UTF-8
  • REPOS="$1"                   # 仓库的路径
  • REV="$2"                     # 新提交的版本号
  • LOGTIME=$(date "+%Y-%m-%d") # 日志时间
  • UPFILE=/svn/log/"$LOGTIME "update.log     # 钩子脚本的日志(需创建对应目录,手动标红)
  • SVNLOOK=/usr/bin/svnlook # svn某一执行函数
  • changed=$($SVNLOOK changed -r $REV $REPOS) # 比较改变的文件
  • echo "$changed" >> $UPFILE # 输出比较结果到日志文件
  • #  svn提交日志  start
  • LOGFILE=/svn/log/"$LOGTIME "svn.log     # 钩子脚本的日志,手动标红
  • # 脚本的标准输出和标准错误输出都打印到日志文件里
  • exec 1>>"$LOGFILE"
  • exec 2>&1
  • TIME=$(date "+%Y-%m-%d %H:%M:%S")   #提交时间
  • AUTHOR=$($SVNLOOK author -r $REV "$REPOS")  #提交作者
  • CHANGEDDIRS=$($SVNLOOK dirs-changed $REPOS) #修改的目录集合
  • MESSAGE=$($SVNLOOK log -r $REV "$REPOS")    #提交时的备注信息,不建议用中文
  • function myecho() {
  •     echo "$TIME" "$*"
  • }
  • myecho "**************************************************************"
  • myecho "提交版本:$REV 作者:$AUTHOR"
  • myecho "提交备注:$MESSAGE"
  • myecho "修改目录:$(echo $CHANGEDDIRS | tr '\n' ' ')"
  • #  svn提交日志  end
  • /usr/local/php/bin/php /svn/repositories/test/hooks/svn_post_commit_resources.php # 执行脚本,手动标红
  • #注意:标红行根据实际情况对应修改,需手动创建日志目录

新建一个php执行文件

  • vim /svn/repositores/test/hooks/svn_post_commit_rescources.php

添加以下代码:

  • //读取日志文件
  • $date_time = date('Y-m-d');
  • $f = file_get_contents('/svn/log/'.$date_time.' update.log');
  • //以换行分割字符串,获取对应数组
  • $files = explode("\n", $f);
  • //判断是否数组,不是则强制转为数组
  • if (!is_array($files))$files=(array)$files;
  • //循环更新对应目录
  • foreach ($files as $v) {
  •         // 取文件名
  •         $f_tem = trim(substr($v, 2));
  • // 获取更新文件名
  • $f_name = '/web/test2/' . $f_tem;
  • // svn更新命令
  •         $cmd = "svn update '$f_name'";
  •         //执行svn命令
  •         exec($cmd, $out);
  •         // exec($cmd);
  •         //设置文件权限
  •         exec("chown www:www $f_name");
  • }
  • //删除日志文件
  • // $rm_cmd = "rm -rf /svn/log/$date_time svn/log";
  • // exec($cmd,$out);
  • unlink('/svn/log/'.$date_time.' update.log');
  • exit();

欢迎留言