(一)
下载:svn.haxx.se/dev/archive-2010-06/0320.shtml
tar xzvf subversion-1.6.
tar xzvf subversion-deps-1.6.
(二)
(1) cd /usr/local/src/subversion-1.6.12
(2) ./configure --prefix=/usr/local/subversion --with-openssl=/usr/local/openssl --without-berkeley-db
(3) make
(4) make install
(5) vi /etc/profile
添加
repository文件夹可以删除吗
SVNPATH=$PATH:/usr/local/subversion/bin
export SVNPATH
(6) svnserve --version /* 测试是否安装成功 */
成功消息:
svnserve, version 1.4.2 (r22196)
compiled Aug 10 2009, 18:00:04
Copyright (C) 2000-2006 CollabNet.
Subversion is open source software, see /
This product includes software developed by CollabNet (www.Collab.Net/).
The following repository back-end (FS) modules are available:
* fs_base : Module for working with a Berkeley DB repository.
* fs_fs : Module for working with a plain file (FSFS) repository.
(7)
a 建立版本库根目录
mkdir -p /var/svn
b
svnserve -d -r /var/svn #默认3690端口
svnserve -d -r /var/svn --listen-port=8000
如果已经开启,用以下命令先关闭:
netstat -ntlp
kill -9 xxxx
#启动服务 执行 启动服务, 以deamon方式运行。 本系统采用svnserve方式, 这是小团队项
目的推荐方法. 这种方法维护最少, 配置最简单.
#指令简介:此指令用于启动svn服务,-d指明以守护模式运行,svn自动在3690端口监听
。3690是默认端口,可以使用 svnserve -d -r /var/svn --listen-port=8000 来指定其它端口。
#-r选项用来指定svn服务的根目录,这样用户就可以使用相对路径访问,而不用提供完 整路径。
#使用以下命令检出:(svnserver方式) svn checkout svn://127.0.0.1:81/xxx 以上为示例。IP需要
根据具体情况调整,xxx为版本库路径,若在启动时已指定则可省略。 版本库信息在版
本库文件夹里,所以要删除版本库只需要删除版本库所在的文件夹即可。 另外工作副
本只是自己维护的文件夹,可以用Windows直接删掉,对别人没有影响。千万不要使用
版本库的删除命令,否则版本库里的内容也会被删除。
(8) 建立svn版本库
svnadmin create /var/svn/p1.web
svnadmin create /var/svn/p2.web
svnadmin create /var/svn/p3.web
.........................
(9)建立公共的配置文件
mkdir /var/svn/conf/
(10)
vi /var/svn/conf/passwd
# 配置用户,输入以下内容:
[users]
huanghanqiang=vbvbnm
p1=p1
p2=p2
#可以添加多个,此为用户名密码对。
(11) vi /var/svn/conf/authz
#配置权限,指令简介:此配置文件采用“基于路径的授权”策略,中括号里指定路径,
#以下列出对各用户的授权。包括只读r,读写rw。没有列出的用户,则不允许访问。
#还 可以对用户分组,具体请参考svn手册,以下是简单
例子:
[groups]
everyone = huanghanqiang,p1,p2
groupA = huanghanqiang,p1
groupB = huanghanqiang,p2
[p1.web:/]
@everyone = r
@groupA = rw
[p2.web:/]
@everyone = r
@groupB = rw
(12)修改每一个版本库的配置指向
vi /var/svn/p1.web/f
vi /var/svn/p1.web/f
vi /var/svn/p1.web/f
..........................
说明: [general]
anon-access=none # 使非授权用户无法访问
auth-access=write # 使授权用户有写权限
f # 指明密码文件路径
f # 访问控制文件
realm=hello world!
#认证命名空间,subversion会在认证提示里显示,并且作为,凭证缓存的关键字。 其它采用默认配置. 各语句都必须顶格写, 左侧不能留空格, 否则会出错. 其中f 与 f 在新建版本库时系统不会自动创建,需要自己创建。#指令简介:这是svn配置文件的格式,请按照以上格式书写。
(以下配置要顶格:)
[general]
anon-access=none
auth-access=write
password-db= /var/svn/conf/passwd
authz-db= /var/svn/conf/authz
realm=ok!
(13)实时更新web网页文件
首先把各个版本库下的 /pl 文件改成 /hooks/post-commit,并注意该文件的权限问题
vi /hooks/post-commit
改为如下:
注意:如果出现文件提交时出现:'post-commit' hook failed with error output
这样的错误,很大可能是因为 /hooks/post-commit 文件不可执行,应该
chmod 775 /hooks/post-commit
#!/bin/sh
export LANG=en_US.UTF-8
rm -rf /opt/www/p1.web
svn export --force --username huanghanqiang --password vbvbnm svn://127.0.0.1:8000/p1.web /opt/www/p1.web
chmod 775 -R /opt/www/p1.web
/***********************************************************************************************************
如果文件过于大,而反应太慢的时候,用如下方法:
***********************************************************************************************************/
我们在开发的过程将代码提交到SVN后使用SVN的hook,通过post-commit脚本,在目标文件夹根下执行svn update操作,将更新内容同步到测试环境,这样开发调试非常方便。
现在SVN库的文件数量越来越多,svn 本地的目录已经3个多G了,几十万个文件,在目标文件夹下执行
svn update进行更新速度也就越来越慢了,常常提交之后SVN客户端会等几分钟没有响应,在没有响应的时间内,无法再继续提交内容。如果使用zendstudio进行提交的话,所有保存的操作都要等这个SVN提交完成才能继续。
原post-commit内容:
--------------------------------------------
#!/bin/sh
REPOS="$1"
REV="$2"
WEB=/data/web
FRAMEWORK=/data/framework
export LC_ALL=zh_CN.UTF-8
a=`svn update $WEB $FRAMEWORK /data/conf /data/shell -
-username x*******i --password ******* | grep 'nginx\.conf'`
if [ -n "$a" ]
then
kill -HUP `cat /dev/shm/nginx.pid`
fi
chown -R www.www $WEB &
-----------------------------------------------
我们主要做了以下几个工作:
1、SVN更新后,同步在/data/web、/data/framework、/data/conf、 /data/shell 4个文件夹在下执行svn update命令进行同步更新操作。
2、如果/data/f文件修改了,那么重启nginx。
3、将所有/data/web目录下的文件所有者和组都变成www。
原因在于:
1、提交的SVN的时候,4个文件在根下进行更新,文件数量巨大响应非常慢。
2、chown的操作也是比较浪费。
解决的想法:
对有变化的文件进行 svn update 这样更有效率。
解决的思路:
1、得到本次提交更新的文件。
2、在目标目录中更新指定的文件。
3、同时将指定文件所有者和组变成www。
4、使用PHP程序当shell来完成这样的工作。
最后的成果是巨大的,现在svn提交已经是飞一样的快了,要知道svn 本地的目录已经3个多G了,几十万个文件。
实现步骤:
1、得到更新的文件。
通过分析我们发现post-commit脚本有两个变量
# 库的路径
REPOS="$1"
# 新提交的版本号
REV="$2"
通过这样的操作就可以得到本次更新的内容与文件。
changed=$(svnlook changed -r $REV $REPOS)
2、将得到的本次更新的内容提交给PHP脚本来处理,分析哪些文件发生变化。
/usr/local/php/bin/php-cgi -q /data/shell/svn_post_commit_resources.php "$changed" &
用PHP分析出哪些文件发生变化后,构造shell命令,由PHP调用shell命令进行更新。
3、相关脚本:
最新的post-commit文件内容:
-------------------------------------
#!/bin/sh
# 库的路径
REPOS="$1"
# 新提交的版本号
REV="$2"
WEB=/data/web
FRAMEWORK=/data/framework
export LC_ALL=zh_CN.UTF-8
changed=$(svnlook changed -r $REV $REPOS)
log=$(svnlook log -r $REV $REPOS)
n=$'\n'
/usr/local/php/bin/php-cgi -q /data/shell/svn_post_commit_resources.php "$changed" &
--------------------------------------
处理更新内容,执行更新命令的PHP脚本文件 svn_post_commit_resources.php 的内容:
-----------------------------------------
<?php
$files = explode("\n", $argv[1]);
if (!is_array($files)) {$files=(array)$files;};
foreach ($files as $v)
{
// 取文件名
$f_tem = trim(substr($v, 2));
// 取最顶层目录名
$d_tem = substr($f_tem, 0, strpos($f_tem, '/'));
if (!in_array($d_tem, array('web', 'framework', 'conf', 'shell'))) {
continue;
}
// SVN copy 对应的文件
$f_name = '/data/' . $f_tem;
$cmd = "svn update '$f_name' --username x****i --password K****$;chown www.www '$f_name'";
exec($cmd);
if (strpos($f_tem, 'f')) {
ex
ec("kill -HUP `cat /dev/shm/nginx.pid`");
}
}
exit();
?>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论