http://blog.csdn.net/showso2006/article/details/6750441

多人开始使用subversion之后,就想着,要建立一个测试用的服务器,不需要把文件update到本地再进行测试。

原理:基于subversion的钩子,即hook(在每个版本库下有hooks文件夹,里面有很多钩子程序)。在subversion执行一个操作时,那会相应的首先去调用相关的钩子程序(如果存在的话)。那么实现一个同步的测试服务器,我们只需要在一个用户执行完毕一个commit操作之后,让钩子程序去自动更新测试服务器的文件即可。通过这个思路,我们需要作的就是建立一个post-commit的钩子。

钩子文件在你的svn版本库hooks目录下,即存放subversion版本数据的文件夹。以我写的情况为例,
Linux的钩子文件应该在/var/svn/project/hooks(其中project为版本库)
文件夹内已经存在有一些.tmpl文件,这些只是一些模板或者说是示例文件。它们不会被执行。

先以linux为例,来讲讲如何构建一个同步的测试服务器127.0.0.2(在Ubuntu 6.10,apache2.0.55,subversion1.3.1下调试通过。2007/1/18)
我们假设你已经建立好了一个apache+subversion的环境。
0.准备工作
为同步服务器建立访问subversion版本的权限,清参考以前的文章

sudo htpasswd /etc/apache2/dav_svn.passwd jackchen

1. 使用checkout建立一个工作复本

cd /var/www
sudo mkdir /var/www/test #建立测试服务器站点根目录

sudo chown www-data.www-data test#更改用户所有者为Apache(www-data)的用户和所属组(这个用户和组可以打开httpd.conf文件查看USER和GROUP,不同的系统可能不一样)

sudo su www-data#切换到www-data,需要使用sudo,因为超级权限可以使用任何用户,而不需要密码,执行后会发现命令提示符可能会有变化

cd /var/www/test
svn checkoutsvn://127.0.0.1/var/svn/project test #以apache用户取出subversion上的文件,因为以后同步都是由Apache完成,所以执行权限应该为Apache用户
#请保证执行checkout语句的用户是www-data,否则在以后钩子调用update时会出现无法创建或修改文件的错误

exit #退出www-data用户

说明:我们必须把/var/www/test目录的所有者设置成apache的运行者(www-data),他必须对文件夹具有完全的可读写操作权限。我使用

sudo chown www-data www
sudo su www-data

这样的方式来避免把/var/www/test目录设置成777的权限。
另外可以执行下面的代码实现相同的功能:

cd /var/www

sudo mkdir /var/www/test #建立测试服务器站点根目录
sudo svn checkoutsvn://127.0.0.1/var/svn/project test#取出subversion上的文件,可能需要密码
sudo chown -R www-data.www-data test #把文件用户修改成apache的执行用户

之后使用

ls -Al test应该可以得到

drwxr-xr-x 7www-data www-data 4096 2007-01-17 10:21 .svn
  ...一些其他的文件

2。设置apache,把你需要的域名指向这个文件夹。

sudo gedit/etc/apache2/sites-available/test

输入以下文字

ServerAdmin rollenc@localhost.com         ServerName localhost         DocumentRoot /var/www/test                 Options FollowSymLinks         AllowOverride None                           Options Indexes FollowSymLinks MultiViews         AllowOverride None         Order allow,deny         allow from all         # Uncomment this directive is you want to see apache2's         # default start page (in /apache2-default) when you go to /         #RedirectMatch ^/$ /apache2-default/                    ErrorLog /var/log/apache2/test_error.log           # Possible values include: debug, info, notice, warn, error, crit,         # alert, emerg.         LogLevel warn           CustomLog /var/log/apache2/test_access.log combined         ServerSignature On

启用他

sudo ln -s /etc/apache2/sites-available/test/etc/apache2/sites-enabled/test

重启apache。

sudo apache2 -k restart

在浏览器上使用http://测试服务器IP  可以浏览到你subversion上最新版本

3。建立钩子
现在是关键的一步,我们需要使我门的测试服务器127.0.0.2进行同步更新:
在/var/svn/hooks/目录下建立post-commit文件

cd /var/svn/hooks/ sudo gedit post-commit

输入以下内容

#!/bin/sh
REPOS="$1"
REV="$2"
export LANG=zh_CN.UTF-8

svn update /var/www/test --username server --passwordserverpassword

#echo `whoami`,$REPOS,$REV >>/home/rollenc/svn_hook_var.txt
#svn update /var/www/test --username server --passwordserverpassword2>/home/rollenc/svn_hook_log.txt

说明:REPOS即第一个变量$1是subversion数据库的地址,REV即第二的变量$2是commit之后的版本号,注意:脚本左边不能留空格。
编辑完毕后设置文件权限为可执行:

sudo chmod 755 post-commit

搞定。
下面来试一下,同步有没有成功。
再建立一个工作副本,然后添加或者修改一些东西,最后上传。
以下的操作是在客户端中进行了,不需要在服务器断进行。

cd /var/www svn checkout svn checkout svn://127.0.0.1/var/svn/project test #取出subversion上的文件作为你的工作副本,你的工作以后就在这个文件夹内展开。 #所以,不需要sudo,但要保证有127.0.0.6文件夹存在,而且可写 echo '' > phpinfo.php #建立一个phpinfo文件 svn add phpinfo.php   #把phpinfo加入版本库 svn commit  #提交

如果报错为:方法MERGE失败于 “/repos/test”: 200 OK (http://192.168.0.114/)

记得修改/etc/subversion/servers文件,把里面的store-plaintext-passwords = no前面的#去掉

乱码问题:export LANG = 你linux系统的环境变量LANG的值

在浏览器中你设定的同步服务器地址http://测试服务器IP/phpinfo.php,愿上帝保佑你的成果一切正常。可以看到phpinfo的信息。

如果不正常你可以稍微修改上面使用#注释掉的命名,使其输出的文件目录符合你的系统。
去掉#,重新运行,并通过查看上面设置的txt来获得一些信息。
第一句[#echo...]是获取当前的执行用户(如果正常应该与apache的执行用户和测试服务器文件所有者相同),$REPOS,$REV是获得的两个参数
第二句[#svn...]是把update的获取update的结果,一般错误信息在这里可以得到。

在Windows下我使用同样的方法试图建立钩子,但没有成功。感谢水蓝色青蛙(QQ:565259)的帮助,windows下的钩子问题解决。
以下是方法和代码,在windows XP下测试成功。
1,2步很类似,不再重复了
经过1,2步的操作之后,DIR的值E:/htddocs/testserver.lab.luochunhui.com为测试服务器的根目录。如果是win2003,你可能还需要参照ubuntu的方法设置一些权限。
第三步的中的钩子程序名称需要改为:post-commit.bat写成如下:

@echo off SET REPOS=%1 SET USER=%2 SET SVN="D:/subversion/bin/svn.exe" SET DIR="E:/htddocs/testserver.lab.luochunhui.com" (call %SVN% update %DIR% --username server --password serverpassword --non-interactive)

SET REPOS=%1 SET REV=%2 SET svn="D:/subversion/bin/svn.exe" SET DIR="E:/htdocs/testserver.lab.luochunhui.com" %svn% update %DIR%

按理说,和linux的执行是一样的,但就是出错。
如commit一个test文件,则显示错误信息为:

Modified: E:\htdocs\testcopy\test.php
Sending content: E:\htdocs\testcopy\test.php
Error: Commit failed (details follow):
Error: MERGE request failed on '/lab.luochunhui.com/trunk'
Error: MERGE of '/lab.luochunhui.com/trunk': 200 OK(http://127.0.0.10)

而此时,test.php已经commit成功,在subversion数据库中已经存在有本次记录,但E:\htdocs\testcopy工作复本还是显示为没有commit。需要同步的E:/htdocs/testserver.lab.luochunhui.com也没有update。

我个人压根不懂windows下的编程,以上代码是边google边学来的。所以还是希望有达人帮忙,好让我完成这篇blog,我也好给大家一个完整的交待。

最终参考了一些文档,还是没能解决win下的问题,我把测试和输出结果放下面:

@echo off echo "" >  E:/hookLog.txt echo "1" >> E:/hookLog.txt SET REPOS=%1 echo "2" >> E:/hookLog.txt SET USER=%2 echo "3" >> E:/hookLog.txt echo %REPOS%, %USER% >> E:/hookLog.txt SET SVN="D:/subversion/bin/svn.exe" echo "4" >> E:/hookLog.txt SET DIR="E:/htdocs/testserver.lab.luochunhui.com" echo "5" >> E:/hookLog.txt REM call %SVN% update %DIR% >> E:/hookLog.txt REM SET PATH=D:/subversion/bin/ REM svn update "E:/htdocs/testserver.lab.luochunhui.com" >> E:/hookLog.txt (call %SVN% update "E:/htdocs/testserver.lab.luochunhui.com") >> E:/hookLog.txt echo "6" >> E:/hookLog.txt

REM是注释,REM掉了我使用的很多种测试,切换REM可以运行其它的一些测试,但是全部无效。
以下是上面代码的输出:

""  "1"  "2"  "3"  E:/svn2, 54  "4"  "5"  "6"

1-6全部正常输出,惟一的是 svn update这一句没有输出任何东西。
完全放弃!等待达人。。。。

SVN 钩子 同步测试服务器的更多相关文章

  1. centos 6.8 设置svn钩子同步至web目录

    1.在web目录创建项目目录 mkdir ./opt/wwwroot/项目名称 2.使用svn检出项目文件 svn checkout svn://localhost:/项目名称 3.设置svn库中钩子 ...

  2. LINUX环境下SVN安装与配置(利用钩子同步开发环境与测试环境)

    安装采用YUM一键安装: 1.环境Centos 6.6 2.安装svnyum -y install subversion 3.配置 建立版本库目录mkdir /www/svndata svnserve ...

  3. centos7配置svn钩子hooks脚本自动同步代码到项目目录

    由于项目需要,svn提交后的代码希望再测试服务器上测试,每次提交后还要手动去svn update一次 十分麻烦,配置好svn钩子以后就省去了这些麻烦. 进入svn版本库目录找到hooks目录找到文件p ...

  4. svn钩子(hooks)

    首先你需要搭建出自己的svn环境出来,并能成功导入导出,并且了解svn,这是看这篇文章的前提.... 出于公司开发部需要svn同步更新服务器代码,需要用到svn钩子(hooks)技术,以前从来没听过, ...

  5. 使用svn钩子遇到的坑

    1.svn钩子(hooks)自动部署代码到web目录(以前公司用,很好奇怎么做的,折腾了两天,掉进了坑里)共勉!!! web目录:/home/www/xiaokai svn版本库目录:/svn/xia ...

  6. svn代码同步脚本

    碰到一个需求,主要是2个项目需要用到同一份代码,主要是域名和配置信息不一样,而且要把svn更新的代码同步过去.本来考虑提交时用钩子同步过去,但考虑到同步过去的代码还需要测试,而且另一边代码的时效性不强 ...

  7. svn钩子(hooks)自动部署代码到web目录

      版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/li956732806/article/details/71158869   web目录:/hoe ...

  8. 钉钉自定义机器人配合SVN钩子事件进行消息的推送实践

    目前很多公司还是使用SVN(TortoiseSVN)进行版本控制,使用简单,适合管理一般项目.协同办公软件目前钉钉比较成熟,阿里也一直在宣传推广,这两年公司也在使用,主要用于信息的沟通,其它的绩效.考 ...

  9. 实现本地svn目录同步时,服务器的相应目录保持自动同步

    提交一个TEST文件夹 但是服务器上并没有显示 而新检出的目录却有 这个时候需要手动去update才会显示,而不可能每次都去update,所以,就用到配置自动更新 1.创建svn目录:mkdir /v ...

随机推荐

  1. python基础之字符串常用操作总结

    字符串的索引 s = 'ABCDLSESRF' # 索引 这两个很简单没什么说的 s1 = s[0] print(s1) # A s2 = s[2] print(s2) # C 切片 s = 'ABC ...

  2. laravel 5.1部署到 集成环境 lnmp上

    laravel 5.1 需要配置:php版本 >= 5.5.9 如果php版本不够可以升级 1.切换到安装包目录 # cd /lnmp1.3-full 2.升级php命令 # ./upgrade ...

  3. Android开发之getX,getRawX,getWidth,getTranslationX等的区别

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/51550031      好久没写博客了,最近工作确实挺忙的,刚刚结束了一个TV项目的开发,对 ...

  4. js常用返回网页顶部几种方法

    一.使用锚标记 此方法最简单,只需在body下放个隐藏的锚点标记,内容如下:  代码如下 复制代码 <a name="top" id="top">& ...

  5. leetcode 中等题(2)

    50. Pow(x, n) (中等) double myPow(double x, int n) { ; unsigned long long p; ) { p = -n; x = / x; } el ...

  6. HDU_1024.MaxSumPlusPlus(基础DP + 滚动数组优化讲解)

    这道题打破了我常规的做题思路,因为这是我刚开始训练DP,感觉这道题目好晕眼呀,emm其实就是感觉自己是真的菜...... 为什么说打破了我的做题思路呢,因为我平时看题解都是在已经AC或者完全不懂的情况 ...

  7. 164. Maximum Gap (Array; sort)

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  8. ES6之扩展运算符

    一 将数组转换为用逗号分隔的参数序列 let turtles = ['Leo','Raph','Mikey','Don']; console.log(...turtles); 二 在解构赋值时使用 l ...

  9. TZOJ 二分图练习

    二分图主要是 1.如何建图,谁匹配谁,怎么匹配 2.判断求的是什么:最大匹配=最小点覆盖,最大独立子集=最小路径覆盖=最小边覆盖=图中顶点数-最大匹配 A.2733:棋盘游戏 描述 小希和Gardon ...

  10. django序列化单表的4种方法的介绍

    这里主要是讲序列化单表的几种方法 先看下models中设计的表结构 from django.db import models # Create your models here. class Book ...