svn服务器搭建:https://www.linuxidc.com/Linux/2017-05/144254.htm

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

网站目录:/web/test/

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

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

或者 svn co svn://(服务器ip)/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

注意事项:

(1)不要遗漏第一行的#!/bin/sh,否则post-commit会报代号255的错误,

保存后,修改文件权限为755,否则SVN无法调用执行,这是一个比较安全的做法;

(2)或者直接修改post-commit的权限为777,可省略#!/bin/sh;

(3)文件权限修改:chmod 755 /svn/repositores/test/hooks/post-commit

3、同步更新优化思想

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

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

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

步骤如下:

(1)新建一个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 # 执行脚本

注意:标红行根据实际情况对应修改,需手动创建日志目录

(2)新建一个php执行文件

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

添加以下代码:

<?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();

linux 下svn同步更新钩子的更多相关文章

  1. linux下svn定时更新项目

    方法一.用shell脚本定时更新项目   1.进入网站的根目录,假设项目位置放在/var/www/test cd /var/www/test   2.建立脚本文件update.sh,分两步进行.首先利 ...

  2. Linux 下SVN自动更新

    1.找到svn的所在目录: 我的目录在/usr/local/svn/myproject 2.新建post-commit vim hooks/post-commit #!/bin/shexport LA ...

  3. linux下svn 搭建

    linux 下SVN搭建加自动提交更新到指定目录一.安装#yum install subversion       yum安装SVN#mkdir -p /opt/svn/repos       创建s ...

  4. linux下svn命令使用大全

    最近经常使用svn进行代码管理,这些命令老是记不住,得经常上网查,终于找了一个linux下svn命令使用大全:1.将文件checkout到本地目录 svn checkout path(path是服务器 ...

  5. Linux下SVN命令

    一下内容转载于:http://blog.chinaunix.net/space.php?uid=22976768&do=blog&id=1640924.这个总结的很好~ windows ...

  6. Linux下svn命令详解

    本文主要是说明linux下svn命令的使用方法,同时记录自己在使用中遇到的一些疑惑. 1.Linux命令行下将文件checkout到本地目录 svn checkout url(url是服务器上的目录) ...

  7. linux下svn命令大全

    linux下svn命令大全 1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/p ...

  8. linux下svn常用指令

    windows下的TortoiseSVN是资源管理器的一个插件,以覆盖图标表示文件状态,几乎所以命令都有图形界面支持,比较好用,这里就不多说.主要说说linux下svn的使用,因为linux下大部分的 ...

  9. [转载]linux下svn常用指令

    一下内容转载于:http://blog.chinaunix.net/space.php?uid=22976768&do=blog&id=1640924.这个总结的很好~ windows ...

随机推荐

  1. Nginx常用rewrite跳转重定向实例

    1.将www.myweb.com/connect 跳转到connect.myweb.com rewrite ^/connect$ http://connect.myweb.com permanent; ...

  2. kafkaconsumer SimpleExample

    package kafka.simple; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Colle ...

  3. 利用RELK进行日志收集

    利用RELK进行日志收集 发布时间:April 3, 2018 // 分类:运维工作,开发笔记,python // No Comments 前不久在做应急的总是遇到要求对日志进行分析溯源,当时就想到如 ...

  4. sshd_config注释

    [root@H0f ~]# cat /etc/ssh/sshd_config #update by H0f -- # $OpenBSD: sshd_config,v // :: djm Exp $ # ...

  5. python3 importlib模块简单利用

    importlib作用:根据字符串形式导入模块,并且找到其中的类并执行 import importlib # m = importlib.import_module("src.plugins ...

  6. hdfs namenode/datanode工作机制

    一. namenode工作机制 1. 客户端上传文件时,namenode先检查有没有同名的文件,如果有,则直接返回错误信息.如果没有,则根据要上传文件的大小以及block的大小,算出需要分成几个blo ...

  7. Broken Keyboard (a.k.a. Beiju Text) UVA - 11988 (链表)

    题目链接:https://vjudge.net/problem/UVA-11988 题目大意:输入一个字符串,输出在原本应该是怎么样的?  具体方法是 碰到' [ ' 回到最前面  碰到‘ ]’  回 ...

  8. 获取url传的参数转变为对象的方法

    function GetRequest() { var url = location.search; //获取url中"?"符后的字串 var theRequest = new O ...

  9. vue-cli构建项目在index.html中使用静态文件

    在vue-cli构建的项目中,且使用在移动端,我们希望每一个页面加载时都可以使用flexible.js来适配手机. 那么这个flexible.js被import到每一个组件中就不合适了. 好的方法是直 ...

  10. Erlang C 與M/M/N排隊模型

    一何谓排队模型 在现实生活中排队的现象可说是无处不在,如:买票.超商.百货公司…等.顾客总是在揣测"排在哪一个服务台会比较快?"或"到底还要排多久呢?"类似这样 ...