=====================******************************************==================================================================
一、进行SVN所需要的各个安装包的安装
以下安装是在RHEL5.5默认安装的情况下,以root身份进行安装!
这个实验我安装了n次,最后总是不成功,因为涉及到略多的软件和配置。下面是安装步骤和配置,自己记下来。希望给下次配置的时候不要像以前那么费劲了!
1 .下载安装apr,下载地址:http://apr.apache.org/
[root@localhost pub]# tar -jxvf apr-1.3.12.tar.bz2 首先解压缩
[root@localhost pub]# mkdir /usr/local/apr 建立apr要安装到的目录
[root@localhost pub]# cd apr-1.3.12
[root@localhost apr-1.3.12]# ./configure –prefix=/usr/local/apr 开始配置编译
[root@localhost apr-1.3.12]# make;make install 安装
2.安装apr-util
[root@localhost pub]# tar -jxvf apr-util-1.3.9.tar.bz2
[root@localhost pub]# cd apr-util-1.3.9
[root@localhost apr-util-1.3.9]# mkdir /usr/local/apr-util
[root@localhost apr-util-1.3.9]# ./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr
[root@localhost apr-util-1.3.9]# make;make install
3.安装neon
在安装之前,需要确认libxml2,如果没有安装需要安装上!
[root@localhost pub]# rpm -q libxml2
libxml2-2.6.26-2.1.2.8
[root@localhost pub]# rpm -q libxml2-devel
libxml2-devel-2.6.26-2.1.2.8
;下载neon库,使svn支持webdav,https加密的链接.(下载并重命名即可,subversion会自动监测并配置),目前只支持 0.25.5.
[root@localhost pub]# tar -zxvf neon-0.25.5.tar.gz
[root@localhost pub]# mkdir /usr/local/neon
[root@localhost pub]# cd neon-0.25.5
[root@localhost neon-0.25.5]# ./configure –prefix=/usr/local/neon
[root@localhost neon-0.25.5]# make;make install
4.安装Berkeley DB (svn保存文件更新数据库的方法有两个,一种是直接使用 fs (filesystem)来保存,另一种是通过Oracle提供支持的开源数据库 Berkeley DB 进行保存。)
[root@localhost pub]# cd /usr/local/src
[root@localhost src]# tar -zxvf /var/ftp/pub/db-4.6.18.tar.gz
[root@localhost src]# cd db-4.6.18/
[root@localhost db-4.6.18]# cd build_unix/
[root@localhost build_unix]# mkdir /usr/local/berkeleydb
[root@localhost build_unix]# ../dist/configure –prefix=/usr/local/berkeleydb –enable-cxx
其中-enable-cxx就是编译C++库,这样才能编译Berkeley DB数据库的PHP扩展php_db4.
yum -y install gcc-c++安装一下就可以了
[root@localhost build_unix]# make;make install
[root@localhost build_unix]# echo ‘/usr/local/bekeleydb/lib/’>>/etc/ld.so.conf
[root@localhost build_unix]# ldconfig
这2句的作用就是通知系统Berkeley DB的动态链接库在/usr/local/berkeleydb/lib/目录
5.安装sqlite-amalgamation-3.6.13.tar.gz
[root@localhost pub]# tar -zxvf sqlite-amalgamation-3.6.13.tar.gz
[root@localhost pub]# mkdir /usr/local/sqlite
[root@localhost pub]# cd sqlite-3.6.13/
[root@localhost sqlite-3.6.13]# ./configure –prefix=/usr/local/sqlite
[root@localhost sqlite-3.6.13]# make;make install
6.编译安装httpd, 下载地址:http://httpd.apache.org/
;此模块的安装需要注意相应HTTPD.CONF配置文件中相应的服务器名称、IP地址和端口。特别要注意本机的IP地址。
;需要netstat -ant telnet
[root@localhost pub]#tar xvzf httpd-2.2.4.tar.gz//解压apache2安装包
[root@localhost pub]#cd httpd-2.2.4//进入解压后的目录
[root@localhost httpd-2.2.4]# mkdir /usr/local/apache2
[root@localhost httpd-2.2.4]# ./configure -prefix=/usr/local/apache2 –enable-dav –enable-so –enable-maintainer-mode –enable-rewrite –with-apr=/usr/local/apr/bin/apr-1-config –with-apr-util=/usr/local/apr/bin/apu-1-config
//配置apache安装,后面的第一个参数是定制apache安装到那个目录,–enable-dav –enable-so是和subversion整合时需要的
./configure -prefix=/usr/local/apache2 –enable-dav –enable-so –enable-maintainer-mode –enable-rewrite –with-apr=/usr/local/apr/bin/apr-1-config –with-apr-util=/usr/local/apr/bin/apu-1-config
./configure --enable-modules=all --enable-mods-shared=all --enable-so --enable-cgi --enable-dav --enable-dav-fs --enable-dav-lock
[root@localhost httpd-2.2.4]# make;make install 完成安装,如果没有错误,真的太幸运了,哈哈。出现错误是很挠头的!
[root@localhost pub]# cd /usr/local/apache2/
[root@localhost apache2]# bin/apachectl start 启动web服务,并访问,注意防火墙,如果能正确的访问,说明没有问题,ok了!
[root@localhost apache2]# bin/apachectl stop 可以停止,接着安装其他的软件包了。
将APACHE加入到系统自动启动中。
echo "usr/local/apache2/bin/apachectl star" >>/etc/rc.local
7安装subversion1.6.5
http://subversion.tigris.org/
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=10339&expandFolder=10339&folderID=260 subversion-1.6.5.tar.gz和subversion-deps-1.6.5.tar.bz2下载地址
[root@localhost pub]# tar -zxvf subversion-1.6.5.tar.gz
[root@localhost pub]# tar -jxvf subversion-deps-1.6.5.tar.bz2
./configure以前,需要yum -y install openssl-devel否则会一直报错,提示你configure的时候加上–with-openssl,即使你加上了也会报错,因为需要一个openssl.h(具体的名字忘了)的头文件,如果你没有安装openssl-devel这个软件包的话,这个.h文件系统中是没有的。再解压缩subversion-devel-1.6.11.tar.gz后,会在解压缩subversion-1.6.11.tar.gz产生的文件夹内生成zlib文件,在configure时,要加上他的路径,否则configure: error: –with-zlib requires an argument.也是报错!
[root@localhost subversion-1.6.5]#./configure –prefix=/usr/local/subversion –with-apxs=/usr/local/apache2/bin/apxs
–with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –with-neon=/usr/local/neon –with-sqlite=/usr/local/sqlite
–with-ssl –with-zlib=/var/ftp/pub/subversion-1.6.5/zlib –enable-maintainer-mode –without-berkeley-db
{
本机的命 令
./configure -prefix=/usr/local/subversion -with-apxs=/usr/local/apache2/bin/apxs -with-apr=/usr/local/apr -with-apr-util=/usr/local/apr-util -with-neon=/usr/local/neon -with-sqlite=/usr/local/sqlite -with-ssl -with-zlib=/home/qu/svnintall/subversion-1.6.5/zlib -enable-maintainer-mode -without-berkeley-db
}
在make之前一定要执行下一步,否则就会报错如下:
/usr/bin/ld: cannot find -lexpat
collect2: ld returned 1 exit status
make: *** [subversion/svn/svn] Error 1
我也是出现错误了,报错了,然后百度,google一顿狂搜,愣是没有搜到我要的答案,不过大体上知道是缺少一个库文件,这个文件的名称应该包含lib,或expat,因为提示是没有找到lexpat嘛,所以,我就一个软件包一个软件包的测试,才找到这个软件包的,在安装完这个软件包之后,make才继续进行下去的!!!!需要安装的软件包主要是这两个:expat-1.95.8-8.2.1.i386.rpm和expat-devel-1.95.8-8.2.1.i386.rpm
[root@localhost Server]# rpm -ivh expat-1.95.8-8.3.el5_4.2.i386.rpm
warning: expat-1.95.8-8.3.el5_4.2.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing… ########################################### [100%]
1:expat-devel ########################################### [100%]
[root@localhost Server]# rpm -ivh expat-devel-1.95.8-8.3.el5_4.2.i386.rpm
warning: expat-devel-1.95.8-8.3.el5_4.2.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing… ########################################### [100%]
1:expat-devel ########################################### [100%]
[root@localhost subversion-1.6.5]#make
[root@localhost subversion-1.6.5]#make install
完成安装。
三、在 apache 中配置 SVN (本机测试。。。)
在usr/local/subversion/下
mkdir -p /opt/svn/conf
mddir -p /opt/svndata
(1) vi /usr/local/apache2/conf/httpd.conf
进行相应的端口及IP进行配置
如下:
#Listen 12.34.56.78:80
Listen 192.168.230.106:8081
#Listen 80
# If your host doesn't have a registered DNS name, enter its IP address here.
#ServerName www.example.com:80
ServerName 192.168.230.106:8081
(2)HTTPD的启动和停止
重启下 apache:
#service httpd status
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
sudo /usr/local/apache2/bin/apachectl -k start
sudo /usr/local/apache2/bin/apachectl -k stop
(3)telnet localhost 80
① 如果你看到如下两句,说明安装是成功的
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
如果有下面一句就用#注释掉
#LoadModule foo_module modules/mod_foo.so
② 定义 apache 访问 svn 配置:
<Location /svn>
DAV svn
# SVNPath /opt/svndata
SVNParentPath /opt/svndata
AuthzSVNAccessFile /opt/svn/conf/authz.conf
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /opt/svn/conf/passwd.conf
Require valid-user
</Location>
四、配置 svn
①建立 svn 版本库目录
mkdir -p /opt/svndata/repos #可以多建版本库目录
②建立 svn 版本库
svnadmin create /opt/svndata/repos
mkdir -p /opt/svndata/repos #可以多建版本库
③建立本地访问控制文件
/usr/local/apache2.2.9/bin/htpasswd -c /opt/svn/conf/passwd.conf username
然后输入密码即可,默认是 MD5 加密的
/usr/local/apache2.2.9/bin/htpasswd /opt/svn/conf/passwd.conf username1
#追加用户
④建立本地项目控制文件
touch /opt/svn/conf/authz.conf
touch /opt/svn/conf/passwd.conf
authz.conf 文件的内容如下:
[groups]
admin=quyw,svn
[/]
@admin=rw
[repos:/]
quyw=rw
svn=rw
*=r //所有用户的权限为 读
passwd.conf 文件的内容如下:
{
quyw:hAkrNY8NGvBhM
svnqu:A8t6X020Hfo7s
}
本例 authz.conf 内容为:
[groups]
#<groupname1>=<username1>,<username2>
admin=username
#[<versionLib>:projectName/directory]
<A href="mailto:#@=#@=<authorities>
#<username>=<authorities>
[/]
@admin = rw #指定用户组成员可以读写根目录所有应用
[repos:/abc/aaa]
username1= rw #指定用户 username1 可以读写:/abc/aaa 目录的文件
至此,整个安装过程完成了!
五、关于SVN \HTTP的启动等
1、查看 httpd 是否启动
#service httpd status
重启 httpd,查看启动是否正常
#service httpd restart
刚安装的 apache 一般都会报下列信息:
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name,
using 127.0.0.1 for ServerName
说明: 没有在 httpd.conf文件中配置 ServerName 项
#vi /etc/httpd/conf/httpd.conf
--jetqu
#vi /usr/local/apache2/conf/httpd.conf
里面配置
添加
ServerName 主机名(地址):端口 /*端口缺省是 80*/
2、 查看 apache 所占的端口
#netstat –lnp |grep httpd
#netstat -anp | grep :80
如果发现APACHE运行,才利用下列命令杀掉
sudo kill -9 5712
出现 no listening sockets available问题
每个套接字只允许使用一次,但我的电脑就是出现不能绑定端口80的问题,怎么回事?
提示错误为:
make_sock:could not bind to address 0.0.0.0:80 no listening sockets available,shutting down Unable to open logs
首先,查看是哪个程序占用了端口.、
方法是:netstat -a -o
关闭linux 用kill
windows关闭用
1.打开CMD. cmd
2.查找端口号的PID netstat -a -o (有了PID可以看看到底是很那个应用程序占用的)
3.强行关闭 ntsd -c q -p PID(查询出来的PID号码)
3、启动HTTPD
安装成功,下面让我们来看下apache http是否能够正确运行,命令:
sudo /usr/local/apache2/bin/apachectl -k start
sudo /usr/local/apache2/bin/apachectl -k stop
查看网址 http://localhost:8081/
显示it works!
恭喜~~~,到现在为止,apache httpd已经可以正确启动了。
将HTML文件传到相应的apache doc 目录
sudo cp '/home/ibis/Desktop/helloWorld.html' /usr/local/apache2/htdocs/
通过IE进行访问 http://192.168.230.106:8081/helloWorld.html
六、在 apache 中配置 SVN
vi /usr/local/apache2.2.9/conf/httpd.conf
① 如果你看到如下两句,说明安装是成功的
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
如果有下面一句就用#注释掉
#LoadModule foo_module modules/mod_foo.so
② 定义 apache 访问 svn 配置:
<Location /svn>
DAV svn
# SVNPath /opt/svndata
SVNParentPath /opt/svndata
AuthzSVNAccessFile /opt/svn/conf/authz.conf
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /opt/svn/conf/passwd.conf
Require valid-user
</Location>
七、配置 svn
①建立 svn 版本库目录
mkdir -p /opt/svndata/repos #可以多建版本库目录
②建立 svn 版本库
svnadmin create /opt/svndata/repos
mkdir -p /opt/svndata/repos #可以多建版本库
③建立本地访问控制文件
/usr/local/apache2.2.9/bin/htpasswd -c /opt/svn/conf/passwd.conf username
然后输入密码即可,默认是 MD5 加密的
/usr/local/apache2.2.9/bin/htpasswd /opt/svn/conf/passwd.conf username1
#追加用户
④建立本地项目控制文件
touch /opt/svn/conf/authz.conf
本例 authz.conf 内容为:
[groups]
#<groupname1>=<username1>,<username2>
admin=username
#[<versionLib>:projectName/directory]
<A href="mailto:#@=#@=<authorities>
#<username>=<authorities>
[/]
@admin = rw #指定用户组成员可以读写根目录所有应用
[repos:/abc/aaa]
username1= rw #指定用户 username1 可以读写:/abc/aaa 目录的文件
至此,整个安装过程完成了!
五、测试连接
1. 建立启动 svn 的用户
useradd svn
passwd svn
根据提示为用户 svn 设置密码
允许用户 svn 访问版本库
chown -R svn:svn /opt/svndata
chown -R svn:svn /opt/data
(这里我是直接用 root 启动的)
2. 启动 svn
( 1 ) 用设定帐户启动
su - svn -c "svnserve -d --listen-port 9999 -r /opt/svndata"
其中:
su - svn 表示以用户 svn 的身份启动 svn
-d 表示以 daemon 方式(后台运行)运行
-------- listen-port listen-port listen-port listen-port 9999 9999 9999 9999 表示使用 9999 端口,可以换成你需要的端口。但注意,使用 10 24
以下的端口需要 root 权限
-r-r-r-r /opt/svndata /opt/svndata /opt/svndata /opt/svndata 指定根目录是 /opt/svndata
(2)对于单个代码仓库:
启动命令 : svnserve -d -r文件夹路径 --listen-host 192.168.100.131
-d -r
-d -r
其中 --dd表示在后台运行, --rr指定服务器的根目录,这样访问服务器时就可以直接用
svn:// 服务器 ip 来访问了。
如果服务器有多 ip的话 --listen-host 来指定监听的 ip 地址 .
我们可以在 svn 客户端中通过 svn://192.168.100.131 来访问 svn 服务器
( 3 ) 对于多个代码仓库 :
们在启动时也可以用 -r 选项来指定服务器根目录 , 但访问时需要写上每个仓库相对于
n 根目录的相对路径 .
比如 , 我们有两个代码仓库 /opt / svndata /re pos1 和 /opt / svndata /re pos2 , 我们用 :
svnserve -d -r /opt / svndata --listen-host 192.168.100.131 来启动 , 那么在客户
访问时可以用 svn://192.168.100.131/ repos1 和 svn://192.168.1.131/ repos2 来分别访
两个项目启动完成以后
我启动的方法:
[root@austit fabian]# svnserve -d -r /opt/svndata --listen-host 192.168.100.131
注意:
svn 默认端口是 3690 ,你需要在防火墙上开放这个端口。也可以通过 svnserve 的 - -
ten-port 选项来指定一个已经开放的其他端口 , 不过这样的话客户端使用也必须家上端
, 如 svn://192.168.100.200:9999/.......
3. 检查 是否启动成功 : ( 查看是否存在 svnserve 进程 )
ps -ef|grep svnserve
① 启动 apache
/usr/local/apache2.2.9/bin/apachectl start
② 打开浏览器,输入 http://192.168.1.107/svn/repos #本例服务器 ip是
192.168.1.107
使用刚才创建的权限用户名与密码登录即可访问
注意:在你上传文件的时候可能会有如下权限不足的提示
Permission denied
svn: Commit failed (details follow):
svn: Can't create directory '/opt/svndata/repos/db/transactions/0-1.txn':
Permission denied
这是因为 apache 在线程用户没有权限访问 svn 的仓库,两者分别属于不同的用户者
本例 apache 属于 daemon 拥有者,而 svn 仓库属于 svn 拥有者
解决方法:
chown -R daemon /opt/svndata/repos
chmod -R 755 /opt/svndata/repos
重启下 apache:
/usr/local/apache2.2.9/bin/apachectl stop
/usr/local/apache2.2.9/bin/apachectl start
本例是通过Eclipse的svn插件客户端测试的,上传下载完全正常!服务器系统是 linux Fedora
7。
****************************创建启动Subversion的脚本:************************
echo '/usr/local/subversion/bin/svnserve -d -r /home/svn/' > start_svn.sh
chmod +x start_svn.sh
./start_svn.sh
***************************************************************************************
将启动脚本放置到开机自动启动脚本中:
以root身份修改文件:/etc/rc.d/rc.local,添加以下文字:
su -c /home/svn/start_svn.sh svn
六、进行相应的文件的IMPORT
[root@kds fabian]# cd myproject
[root@kds myproject]# ls
[root@kds myproject]# mkdir branches
[root@kds myproject]# mkdir tags
[root@kds myproject]# mkdir trunk
[root@kds myproject]# ls
branches tags trunk
[root@kds myproject]# cd trunk
[root@kds trunk]# touch One.java Two.java Three.java
[root@kds trunk]# ls
[root@kds ~]# svn import myproject file:///opt/svndata/repos1 -m "initial import"
七、其它的具体目录实例:
由于公司按DSS(决策支持系统板块)、ERP(ERP 运营管理板块)、PLM(研发管理板块)、SCM
(供应链管理板块)、ISMIS(信息安全管理体系)、ITSP(IT 支撑平台),即四个板块一个体系和
一个平台来分类存放,外加一个exercise(学习),因此最后的subversion.conf 配置内容如下:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /svn/>
DAV svn
SVNParentPath /svn
SVNListParentPath on
AuthType Basic
AuthName "Sany SVN User Validate"
AuthuserFile /svn/passwd.conf
AuthzSVNAccessFile /svn/svn_authz
Satisfy Any
Require valid-user
</Location>
<Location /svn/dss/>
DAV svn
SVNParentPath /svn/dss
SVNListParentPath on
AuthType Basic
AuthName "Sany SVN User Validate"
AuthuserFile /svn/passwd.conf
AuthzSVNAccessFile /svn/svn_authz
Satisfy Any
Require valid-user
</Location>
八、创建项目应用
#mkdir /var/www/svn/
#svnadmin create dev_svn/var/www/svn/
#chown -R apache.apache /var/www/svn/DEV_SVN/
#service httpd restart
#chkconfig httpd on
要先删除该用户(htpasswd –D),然后再添加该用户和初始密码(htpasswd –D).
九、 数据移植(Win→Linux)
数据导出:
svnadmin dump 项目名>dumpfile
eg:$svnadmin dump myrepos >myrepos
数据导入:
svnadmin load 项目名<dumpfile
eg: $svnadmin load newrepos <myrepos
十、Subversion中 BDB 和 FSFS 两种格式的比较
Berkeley DB
在 Subversion 的初始设计阶段,开发者因为多种原因而决定采用 Berkeley DB,比如它
开源协议、事务支持、可靠性、性能、简单的 API、线程安全、支持游标等。
Berkeley DB 提供了真正的事务支持-这或许是它最强大的特性,访问你的 Subversion
本库的多个进程不必担心偶尔会破坏其他进程的数据。事务系统提供的隔离对于任何给定
操作,Subversion 版本库代码看到的只是数据库的静态视图-而不是一个在其他进程影响
断变化的数据库-并能够根据该视图作出决定。如果该决定正好同其他进程所做操作冲
,整个操作会回滚,就像什么都没有发生一样,并且 Subversion 会优雅的再次对更新的静
视图进行操作。
Berkeley DB 另一个强大的特性是热备份-不必“脱机”就可以备份数据库环境的能力。
备份问题在本文暂不讨论)
Berkeley DB 同时是一个可信赖的数据库系统。Subversion 利用了 Berkeley DB 可以记日
的便利,这意味着数据库先在磁盘上写一个日志文件,描述它将要做的修改,然后再做这
修改。这是为了确保如果任何地方出了差错,数据库系统能恢复到先前的检查点—一个日
文件认为没有错误的位置,重新开始事务直到数据恢复为一个可用的状态。关于 Berkeley
日志文件的更多信息可以参考 svn 中文使用说明中的“管理磁盘空间”一节。
但是每朵玫瑰都有刺,我们也必须记录一些 Berkeley DB已知的缺陷。首先,Berkeley DB 环
境不是跨平台的。你不能简单的拷贝一个在Unix上创建的Subversion版本库到一个Windows
系统并期望它能够正常工作。尽管 Berkeley DB 数据库的大部分格式是不受架构约束的,但
环境还是有一些方面没有独立出来。其次,使用 Berkeley DB 的Subversion 不能在 9 5/9 8 系统
上运行—如果你需要将版本库建在一个 Windows 机器上,请装到 Windows2000 或
WindowsXP 上。另外,Berkeley DB 版本库不能放在网络共享文件夹中,尽管 Berkeley DB 承
诺如果按照一套特定规范的话,可以在网络共享上正常运行,但实际上已知的共享类型几乎
都不满足这套规范。
最后,因为 Berkeley DB的库直接链接到了 Subversion 中,它对于中断比典型的关系型数据
库系统更为敏感。大多数 SQL 系统,举例来说,有一个主服务进程来协调对数据库表的访
问。如果一个访问数据库的程序因为某种原因出现问题,数据库守护进程察觉到连接中断会
做一些清理。因为数据库守护进程是唯一访问数据库表的进程,应用程序不需要担心访问许
可的冲突。但是,这些情况与 Berkeley DB 不同。Subversion(和使用 Subversion 库的程序)
直接访问数据库的表,这意味着如果有一个程序崩溃,就会使数据库处于一个暂时的不一致、
不可访问的状态。当这种情况发生时,管理员需要让 Berkeley DB 恢复到一个检查点,这的
确有点讨厌。除了崩溃的进程,还有一些情况能让版本库出现异常,比如程序在数据库文件
的所有权或访问权限上发生冲突。因为 Berkeley DB 版本库非常快,并且可以扩展,非常适
合使用一个单独的服务进程,通过一个用户来访问—比如 Apache 的 httpd或 svnserve(可以
参考 svn 中文使用说明中的 配置服务器)—而不是多用户通过
FSFS
在 2004 年中期,另一种版本库存储系统慢慢形成了:一种不需要数据库的存储系统。
FSFS 版本库在单一文件中存储修订版本树,所以版本库中所有的修订版本都在一个子文件
夹中有限的几个文件里。事务在单独的子目录中被创建,创建完成后,一个单独的事务文件
被创建并移动到修订版本目录,这保证提交是原子性的。因为一个修订版本文件是持久不可
改变的,版本库也可以做到热备份,就象 Berkeley DB 版本库一样。
修订版本文件格式代表了一个修订版本的目录结构,文件内容,和其它修订版本树中相
关信息。不像 Berkeley DB 数据库,这种存储格式可跨平台并且与 CPU 架构无关。因为没有
日志或用到共享内存的文件,数据库能被网络文件系统安全的访问和在只读环境下检查。缺
少数据库花消同时也意味着版本库的总体体积可以稍小一点。
FSFS 也有一种不同的性能特性。当提交大量文件时,FSFS 使用 O(N)算法来追加条目,
而 Berkeley DB 则用(N^2)算法来重写整个目录。另一方面,FSFS通过写入与上一个版本比较
的变化来记录新版本,这也意味着获取最新修订版本时会比 Berkeley DB 慢一点,提交时 FSFS
也会有一个更长的延迟,在某些极端情况下会导致客护端在等待回应时超时。
最重要的区别是当出现错误时 FSFS不会楔住的能力。如果使用 Berkeley DB 的进程发生
许可错误或突然崩溃,数据库会一直无法使用,直到管理员恢复。假如在应用 FSFS 版本库
时发生同样的情况,版本库不会受到任何干扰,最坏情况下也就是会留下一些事务数据。
唯一真正对 FSFS不利的是相对于 Berkeley DB 的不成熟,缺乏足够的使用和压力测试,
多关于速度和可扩展性的判断都是建立在良好的猜测之上。在理论上,它承诺会降低管理
新手的门槛并且更加不容易发生问题。在实践中,只有时间可以证明。
总之,这两个中并没有一个是更正式的,访问版本库的程序与采用哪一种实现方式无关。
过上文和下表(从总体上比较了 Berkeley DB 和 FSFS 版本库),读者可以自行选择自己需
的存储方式。
要的存储方式。
特性 Berkeley DB FSFS
对操作中断的敏感
很敏感;系统崩溃或者权限问题会导致数据库“塞住”,需要定期进行恢复。 不敏感。
可只读加载 不能 可以
存储平台无关 不能 可以
可从网络文件系统访问 不能 可以
版本库大小 稍大 稍小
可扩展性修订版本树的数量 没有限制 某些本地文件系统在处理单一目录包含上千个条目时会出现问题。
特性 Berkeley DB FSFS
可扩展性:文件较多的目录 较慢 较慢
速度:检出最新的代码 较快 可以
大量提交的速度 较慢,但是时间被分配在整个提交操作中 较快,但是最后较长的延时可能会导
致客户端操作超时组访问权处理 对于用户的umask设置十分敏感,最好只由一个用户访问。 对umask 设置不敏感
功能成熟时间 2001 年 2004 年
十一、FAQ:
3、设置SVNListParentPath 后浏览出现 Forbidden
这时,如果我们在浏览器中输入“http://svn 服务器IP/repos/repos1” (假设存在“repos1”
本库),那么我们可以自己看到“repos”版本库的列表。但是如果我们想查看版本库的根
录,看看有哪些版本库,输入“http://svn 服务器 IP/repos”,回车。却出现:
Forbidden
You don't have permission to access /repos on this server.
再次输入“http://svn 服务器 IP/repos”,回车,还是出现禁止访问的信息。问题出在
Location /repos>”,把它改成“<Location /repos/>”,即在后面加个斜线“/”,问题得到解
。
5.3 htpasswd
创建用户文件:
htpasswd -c \svn\passwd.conf username
添加新用户
htpasswd -b \svn\passwd.conf Newusername newPasswd
更改用户密码:
htpasswd -b \svn\passwd.conf username newPasswd
删除用户(要用大写的 D ):
htpasswd –D E:\usr\Apache2.2\bin\passwd.conf username
svn在linux下的使用(svn命令)
一.Svn 创建新的版本库
#/usr/local/svn/bin/svnadmin create /svn/project/www /*创建仓库"www"
二.添加用户
# /usr/local/apache/bin/htpasswd –c /svn/passwd user1 (user1是用户)
第一次设置用户时使用-c表示新建一个用户文件。回车后输入用户密码,完成对用户的增加。
第二次添加用户不需要带 –c 参数 如:
# /usr/local/apache/bin/htpasswd /svn/passwd user2
三.权限分配
#vi /svn/auth.conf(编辑配置权限配置文件,首先要进入这个目录下,利用cd命令)
[groups] /*这个表示群组设置
Admin=usr1,user2 /*这个表示admin群组里的成员 user1,user2
Develop=u1, u2 /*这个表示Develop群组里的成员 u1,u2
[www:/] /*这表示,仓库www的根目录下的访问权限
user1 = rw /*www仓库user1用户具有读和写权限
user2 = r /* www仓库userl用户具只有读权限
@develop=rw /*这表示 群 develop的成员都具有读写权限
[/] /*这个表示在所有仓库的根目录下
* = r /*这个表示对所有的用户都具有读权限
注意:在编辑authz.conf文件时,所有行都必须要顶头写,不能有缩行出现,否则会报错:"Access denied: 'user1' ",里面的内容可以根据自己的需要自行添加,不必与我上面所写的相同!
四:重启apache服务和启动svn服务
#/usr/local/apache/bin/apachectl –k restart
就可以通过 http://192.168.0.1/svn/www 这个URL来访问仓库了,当然,受权限的限制,必须是合法用户才能访问且具有相应的权限
最后启动svn
#/usr/local/svn/bin/svn -d -r /svn/project
-d 表示以 daemon 方式(后台运行)运行
-r /svn/project 指定根目录是/svn/project
检查服务器是否启动正常:
#ps –ef|grep svnserve
如果显示如下,即为启动成功:
Root 6941 1 0 15:07 ? 00:00:00 svnserve -d ——listen-port 9999 -r /svn
其他常用命令
1、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
2、往版本库中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)
3、将改动的文件提交到版本库
svn commit -m "LogMessage" [-N] [--no-unlock] PATH (如果选择了保持锁,就使用--no-unlock开关)
例如:svn commit -m "add test file for my test" test.php
简写:svn ci
4、加锁/解锁
svn lock -m "LockMessage" [--force] PATH
例如:svn lock -m "lock test file" test.php
svn unlock PATH
5、更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
简写:svn up
6、查看文件或者目录状态
1)svn status path (目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svn status -v path (显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
7、删除文件
svn delete path -m "delete test fle"
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m "delete test file"
或者直接svn delete test.php 然后再svn ci -m 'delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
8、查看日志
svn log path
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
9、查看文件详细信息
svn info path
例如:svn info test.php
10、比较差异
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差异)
例如:svn diff -r 200:201 test.php
简写:svn di
11、将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
12、SVN 帮助
svn help
svn help ci
13、版本库下的文件和目录列表
svn list path
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
14、创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法: 1、mkdir PATH...
2、mkdir URL...
创建版本控制的目录。
1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增
调度,以待下一次的提交。
2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
15、恢复本地修改
svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH...
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复
被删除的目录
16、代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch --relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将
服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的
方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动
(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系。
17、解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH...
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
18、输出指定文件或URL的内容。
svn cat 目标[@版本]...如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)