一、什么是 Subversion?
(本文永久地址:http://www.jb51.cc/article/p-srhokzqs-bmq.html)
Subversion 是一个免费/开源的版本控制系统(version control system,VCS),也就是说,Subversion 可以跨越时间地对文件和目录,以及它们的修改进行管理. 这就允许你恢复数据的旧版本,或检查数据的修改历史. 由于这个特点,很多人把版本控制系统看成是一种“时间机器”。
Subversion 可以跨越网络进行操作,这就允许多个用户在不同的机器上工作. 从某种程度上讲,允许用户在各自的空间里修改和管理同一组数据可以促进团队协作,因为修改不再是单线进行,开发速度会更快. 由于所有的工作都被记录在案,也就不用担心并行开发会降低软件的质量―如果出现不正确的修改,只要撤消那一次更改操作即可。
某些版本控制系统同时也是软件配置管理 (software configuration management,SCM) 系统. 这种系统经过精巧的设计,专门用于管理源代码树,具备许多与软件开发有关的特性―理解编程语言,提供了程序构建工具. 但 Subversion 不是 SCM,它是一个通用系统,可以管理任意类型的文件集合. 对你来说,这些文件可能是源代码文件―对别人来说,可能是一个货物清单或数字电影。
二、Subversion 的架构
图中的一端是存放所有版本数据的 Subversion 仓库,另一端是 Subversion 客户端程序,客户端程序管理着部分版本数据在本地的映射. 两端之间是穿过仓库访问 (Repository Access) 层的多条访问路径,其中一些路径跨越计算机网络,通过网络服务器对仓库进行访问,其他一些路径则不经过网络,直接访问仓库.
三、Subversion 的组件
svn
客户端命令行工具
svnversion
用于报告工作副本状态 (就项目的版本号而言) 的工具
svnlook
可以直接检查仓库的工具
svnadmin
用于创建,调整或修复 Subversion 仓库的工具
mod_dav_svn
Apache HTTP 服务器插件,该插件允许用户通过网络访问仓库
svnserve
一个定制的,可独立运行的服务器程序,可以以守护进程方式运行,也可以被 SSH 调用,这是另一种允许用户通过网络访问仓库的方法
svndumpfilter
过滤 Subversion 仓库转储数据流的程序
svnsync
可以跨越网络对仓库进行增量镜像备份的程序
svnrdump
可以跨越网络对仓库历史进行转储和加载的程序
svnmucc
该工具支持在没有工作副本的情况下,在一个单独的提交中对多个仓库执行基于 URL 的操作
四、安装Subversion前的准备
安装一些常用的依赖包
yum install -y make gcc gcc-c++ perl zlib-devel libaio libpng libpng-devel libjpeg-devel pcre-devel
yum install -y libXpm-devel openssl openssl-devel libxml2-devel bzip2-devel.x86_64 libjpeg-turbo-devel
yum install -y freetype freetype-devel libtool cmake ncurses-devel bison re2c curl-devel wget
rpm -ivh "http://mirrors.sohu.com/fedora-epel/epel-release-latest-6.noarch.rpm"
yum install -y libmcrypt-devel re2c unzip
安装Subversion需要的依赖包
(详情可参考官方文档:http://svn.apache.org/repos/asf/subversion/trunk/INSTALL)
1. Apache Portable Runtime 1.3 or newer
cd /usr/localhost/src
wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.5.2.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.5.4.tar.gz
tar zxvf apr-1.5.2.tar.gz
cd apr-1.5.2
./configure --prefix=/usr/local/apr
make && make install
cd ..
tar zxvf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4
./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr
make && make install
2. Zlib
http://www.zlib.net/
下载的当前版本为zlib-1.2.11.tar
解压后执行
./configure
make && make install
3. autoconf 2.59 or newer
yum install autoconf �Cy
4. libtool 1.4 or newer
yum install libtool -y
5. Apache Serf library 1.3.4 or newer
cd /usr/local/src
wget http://archive.apache.org/dist/serf/serf-1.2.1.tar.bz2
tar jxvf serf-1.2.1.tar.bz2
cd serf-1.2.1
yum install expat expat-devel �Cy
./configure --prefix=/usr/local/serf --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr
make && make install
6. OpenSSL(OPTIONAL)
yum install openssl �Cy
7. Berkeley DB 4.X (可选安装)
yuminstall db4 -y
8.Cyrus SASL library (OPTIONAL)
yum -y install cyrus-sasl*
9. dbus
yum install dbus
10. Qt 4 (可选安装)
yum install qt qt-devel
11. GLib 2 (Unix only,OPTIONAL)
yum install glib2 glib2-devel
12. KDELibs 4 (可选安装)
yum install kdelibs kdelibs-devel
13. Python 2.7 or newer (https://www.python.org/)
(可选择安装)
https://www.sqlite.org/download.html
cd /usr/local/src
wgethttp://www.sqlite.org/2017/sqlite-amalgamation-3180000.zip
unzip sqlite-amalgamation-3180000.zip
先解压好,后面安装Subversion时要用到
五、安装Apache Web Server(2.2.X or newer)
下载源码包
cd /usr/local/src
wget http://mirrors.sohu.com/apache/httpd-2.2.34.tar.gz
tar zxvf httpd-2.2.34.tar.gz
编译&&安装
cd httpd-2.2.34
./configure --prefix=/webapp/apache2 --enable-dav --enable-dav-fs--enable-dav-lock --enable-so --enable-rewrite --enable-modules=all --enable-mods-shared=all --with-mpm=prefork --enable-maintainer-mode --enable-ssl--with-ssl --with-pcre --with-include-apr
make && make install
配置apache
cd /webapp/apache2/
vi conf/httpd.conf
找到
#ServerName www.example.com:80
改成
ServerName localhost:80
检查配置文件语法
bin/apachectl -t
配置启动脚本
cp /usr/local/src/httpd-2.2.34/build/rpm/httpd.init/etc/init.d/httpd
httpd=${HTTPD-/webapp/apache2/bin/httpd}
pidfile=${PIDFILE-/webapp/apache2/logs/${prog}.pid}
CONFFILE=/webapp/apache2/conf/httpd.conf
请根据自己的安装目录更改相应的路径!
然后运行如下命令:
chmod +x /etc/init.d/httpd
chkconfig --add httpd
chkconfig httpd on
/etc/init.d/httpd start
netstat -lnp |grep httpd
六、安装Subversion
官网下载地址:http://subversion.apache.org/download.cgi
这里我们下载1.8版
cd /usr/local/src
wget http://mirrors.tuna.tsinghua.edu.cn/apache/subversion/subversion-1.8.18.tar.gz
tar zxvf subversion-1.8.18.tar.gz
把解压好的sqlite复制到subversion目录下
mv sqlite-amalgamation-3180000subversion-1.8.18/sqlite-amalgamation
cd subversion-1.8.18
./configure --prefix=/webapp/subversion --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --enable-mod-activation --with-apache-libexecdir=/webapp/apache2/modules --with-apxs=/webapp/apache2/bin/apxs --with-serf=/usr/local/serf --with-zlib
make && make install
创建版本库:
要创建一个版本库,首先要确定采用哪种数据存储方式。在 Subversion 中,版本库的数据存储有两种方式,一种是在 Berkeley DB 数据库中存放数据;另一种是使用普通文件,采用自定义的格式来储存,称为 FSFS。
两种版本库数据存储对照表
特性 | @H_301_546@Berkeley DB @H_301_546@FSFS||
---|---|---|
对操作中断的敏感 | 很敏感;系统崩溃或者权限问题会导致数据库“塞住”,需要定期进行恢复。 | 不敏感。 |
可只读加载 | 不能 | 可以 |
存储平台无关 | 不能 | 可以 |
可从网络文件系统访问 | 不能 | 可以 |
版本库大小 | 稍大 | 稍小 |
可扩展性:修订版本树的数量 | 数据库,没有限制 | 许多古老的本地文件系统在处理单一目录包含上千个条目时出现问题。 |
可扩展性:文件较多的目录 | 较慢 | 较快 |
速度:检出最新的代码 | 较快 | 较慢 |
速度: 大的提交 | 较慢,但是时间被分配在整个提交操作中 | 较快,但是最后较长的延时可能会导致客户端操作超时 |
组访问权处理 | 对于用户的umask设置十分敏感,最好只由一个用户访问。 | 对umask设置不敏感 |
功能成熟时间 | 2001年开始使用 | 2004年开始使用 |
确定了具体的数据存储类型,只要在命令行当中执行 svnadmin 命令就可以创建一个 Subversion 版本库,命令如下:
创建文件夹
mkdir /webapp/svndata
PATH=$PATH:/webapp/subversion/bin
执行svnadmin命令创建版本库,指定数据存储为FSFS
svnadmin create --fs-type fsfs /webapp/svndata/data
如果要指定为Berkeley DB,则将fsfs替换为bdb
对于Subversion 1.2以后版本,svnadmin缺省使用fsfs文件系统后端创建版本库。
ll /webapp/svndata/data/
总用量 24
drwxr-xr-x. 2 root root 4096 7月 28 07:29 conf
drwxr-sr-x. 6 root root 4096 7月 28 07:29 db
-r--r--r--. 1 root root 2 7月 28 07:29 format
drwxr-xr-x. 2 root root 4096 7月 28 07:29 hooks
drwxr-xr-x. 2 root root 4096 7月 28 07:29 locks
-rw-r--r--. 1 root root 246 7月 28 07:29 README.txt
conf 目录下存放了版本库的配置文件,包括用户访问控制和权限控制等内容;
db 目录下存放着 Subversion 所要管理的所有受版本控制的数据;
hooks 目录存放着钩子脚本及其模版(一种版本库事件触发程序);
locks 目录存放着 Subversion 版本库锁定数据;
format 文件记录了版本库的布局版本号。
用 svn import 命令来进行项目的导入:
svn import /tmp/ file:///webapp/svndata/data/ --message "init"
确认导入的项目是否正确:
svn list --verbose file:///webapp/svndata/data/
查看最新修订版本的信息:
svnlook info /webapp/svndata/data
"--revision 版本号",指定某一个修订版的显示:
svnlook info /webapp/svndata/data --revision1
显示版本库的具体树形结构,后面的“--show-ids”选项指定显示每一个显示元素的修改版本 ID:
svnlook tree /webapp/svndata/data/ --show-ids
基本的服务器配置
svnserve 是一个轻量级的服务器, 使用自定义的协议通过TCP/IP与客户端通讯。客户端通过由 svn:// 或者 svn+ssh:// 开始的URL访问svnserve服务器。
启动SVN服务器:
svnserve �Cd -r /webapp/svndata
-i作为 inetd 启动
-d做为守护进程启
-r用来指定版本库的根路径
在客户端使用 TortoiseSVN 可以通过如下形式访问服务器:
svn://服务器IP/data
1.svnserve.conf
[general]
# anon-access = read #匿名用户的权限
# auth-access = write #认证用户的权限
password-db = passwd #指定密码文件
# authz-db = authz #权限控制文件
# realm = My First Repository
2.passwd文件的配置及说明
[users]
# harry = harryssecret
# sally = sallyssecret
等号前面是用户名,后面是密码,密码是明文的。更改svnserve.conf的时候,需要重启SVN,更改authz,passwd文件,不需重启。
3.authz文件的配置及说明
[groups]
# harry_and_sally = harry,sally
groups定义的变量就是组名,1个用户组可以包含1个或者多个用户,逗号分隔,上例中harry_and_sally就是一个组
版本库目录格式:
[<版本库>:/项目/目录]
@<用户组名> = <权限>
<用户名> = <权限>
其中,方框号内部可以有多种写法:
[/],表示根目录及以下,根目录是svnserve启动时指定的,这里配置的是/webapp/svndata/,[/]就是表示对全部版本库设置权限。
[data:/],表示对版本库data设置权限
[date:/test],表示对版本库data中的test项目设置权限
[data:/test/aaa],表示对版本库data中test项目的aaa目录设置权限
权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。
权限可以是w、r、rw、和空,空表示没有任何权限。
authz中每个参数都要顶格写,开头不能有空格。
[/]
Kevin = rw
@harry_and_sally = r
设置passwd,authz文件权限
chmod 600 conf/{passwd,authz} #非必须,最好改下
4. Checkout注意事项
在windows上安装客户端TortoiseSVN之后,checkout版本的时候有个地方需要注意。
例如如果创建项目版本库的命令为 # svnadmin create /svn/testversion1/
启动svn服务的命令 # svnserve -d -r /svn/
那么在客户端检出该版本库的URL为:svn://xx.xx.xx.xx/testversion1/
如果启动svn服务的命令为 svnserve -d -r /svn/testversion1/,那么检出的URL则为:svn://xx.xx.xx.xx/
七、与 Apache Http Server 的结合
通过 Http 协议访问版本库是 Subversion 的亮点之一。使用 Http 协议意味着只需要打开浏览器,输入 URL 即可轻松的浏览整个版本库。灵活通常带来复杂性,Http 方式相对于 svnserve 方式来说需要更多的配置。
配置apache
为了使 Subversion 与 dav 模块通信,需要安装 mod_dav_svn 插件,在Apache的 httpd.conf 文件中加入以下内容:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
<Location /data>
DAV svn
SVNPath /webapp/svndata/data
</Location>
重启apache
/etc/init.d/httpd restart
浏览器输入“http://服务器IP/data”
显示:
data- Revision 1: /
这表示mod_dav_svn模块工作正常,如果无法显示,请检查防火墙和SELinx的配置
可以先临时关闭防火墙和SELinx(生产环境请按实际情况配置)
iptables �CF
setenforce 0
可以使用 SVNParentPath 代替SVNPath,
SVNParentPath /webapp/svndate表示/webapp/svndata下的每个子目录都是一个版本库,可以通过:
http://服务器IP/svndata/data1
http://服务器IP/svndata/data2
|
|
|
http://服务器IP/svndata/data10
来访问。
权限设置:
1. Apache基本权限设置
最简单的客户端认证方式是通过HTTP基本认证机制,简单的使用用户名和密码来验证一个用户所自称的身份,Apache提供了一个htpasswd工具来管理可接受的用户名和密码 。
cd /webapp
apache2/bin/htpasswd -c svndata/passwd user1
-c 表示新建一个密码文件
vi apache2/conf/httpd.conf
AuthType Basic
AuthName "svn data"
AuthUserFile /webapp/svndata/passwd
Require valid-user
保存后,重启apache后即可
/etc/init.d/httpd restart
可以把"Require valid-user" 替换为"Require user harry sally",表示只有harry和sally可以访问该版本库。
2. 用 mod_authz_svn 进行目录访问控制
使用mod_authz_svn模块可以更加细致的设置访问权限。
vi apache2/conf/httpd.conf
查看mod_auth_svn 模块是否加载
LoadModule authz_svn_modulemodules/mod_authz_svn.so
<Location /svndata>
DAV svn
SVNParentPath /webapp/svndata
AuthType Basic
AuthName "svn data"
AuthUserFile /webapp/svndata/passwd
AuthzSVNAccessFile /webapp/svndata/accesspolicy
Satisfy Any
Require valid-user
</Location>
AuthzSVNAccessFile 指向的是 authz 的策略文件,详细的权限控制可以在这个策略文件中指定,如:
#两个分组:group1,group2 [groups] group1=user1,user2 group2=user3,user4 #在根目录下指定所有的用户有读权限 [/] *=r #追加group1组用户有读写权限 @group1=rw #在data下给予用户user1读写权限 [data:/] user1=rw #禁止所有用户访问/private目录 [/private] *= #给group2组用户读权限 @group2=r
如果要对具体每个版本库配置,用如下的语法:
[groups] project1=user1,user2 project2=user3,user4 [data1:/] *=r @project1=rw [data2:/] *=r @project2=rw
这样项目1的project1组只能对data1版本库下的文件具有写权限而不能修改版本库data2,同样项目2的project2组也不能修改data1版本库的文件。
修改完配置后记得保存重启apache:
/etc/init.d/httpd restart
另外还要修改对应目录的权限,让它们支持apache运行帐号可写
chown -R daemon:daemon /webapp/svndata/data
这个帐号可在apache配置文件httpd.conf中设置:
User daemon
Group daemon
八、测试
SVN服务器安装配置完毕,在客户端使用TortoiseSVN进行测试,结果如下: