svn概述
众所周知,svn是一种集中式的版本控制工具,是cvs的改进版,那么svn相比cvs的好处在哪里呢?
- 基于目录的版本控制系统(传统的CVS都是基于单个文件进行版本控制的,而SVN可以随意去除任何一个文件、目录的任何一个历史版本)
- 原子提交(提交多个文件时,如果一个文件发生冲突,则其他修改都不会被提交)
- 高效的分支与标签
- 多种访问方式(svn提供了一个抽象的网络访问层,可以通过不同的写来来对其进行访问)
- 对二进制文件的支持
- 平台无关
svn在linux下的安装
Step1:安装必须的包
这里的linux的发行版是centos 6.4,使用yum源进行安装。
- yum install subversion httpd mod_dav_svn
说明:
subversion (SVN服务器)
httpd mod_dav_svn (用于支持WEB方式管理SVN服务器)
Step2:基本的SVN服务器配置
这里最常用的命令是svnadmin,这个命令除了提供创建Subversion版本库的功能,这个程序使你可以维护这些版本库。
其中在你无网络,无google的情况下,最实用的命令就是svnadmin help
1, 建个svn的根目录,因为项目不止一个
- mkdir -p /home/svntest/
2,新建一个新的空的版本仓库(subversion repository)
- svnadmin create /home/svntest/repos
3,初始化版本仓库中的目录
- svn import /home/svntest/repos/ file:///home/svntest/repos -m “初始化SVN目录”
4,添加用户
要添加SVN用户非常简单,只需在/home/svn/svntest/repos/conf/passwd文件添加一个形如“username=password”的条目就可以了。为了测试,我添加了如下内容:
3,修改用户访问策略
/home/svntest/repos/conf/authz记录用户的访问策略,这里主要是给上步配置的用户权限,这里的配置见下图。
说明:r表示对该目录有读权限,w表示对该目录有写权限,rw表示对该目录有读写权限。最后一行的* =表示,除了上面设置了权限的用户组之外,其他任何人都被禁止访问本目录。这个很重要,一定要加上!
4,修改svnserve.conf文件,让用户和策略配置升效.
tips:首先检查svnserve.conf文件,看有没有把password-db = passwd前对#去掉,并且要顶格;authz-db = authz同理。否则可能会出现svn: 认证失败。
5,经历了上述步骤之后,我们需要一个 Subversion server 来服务这个 repository,使得外界的客户端可以访问这个 repository。
- svnserve -d -r /home/svntest
说明:在这里特别的要注意,/home/svntest是仓库的根目录;另外这时候启动svn的server是svn自己提供的独立服务器,通过svn://来访问。
6,忙乎了这么久,测试一下吧
- svn co svn://localhost/repos repos
svn server对http的支持
通过上述步骤之后,只是svn可用,但是还不能通过浏览器http来访问svn。
通过 Http 协议访问版本库是 Subversion 的亮点之一。使用 Http 协议意味着只需要打开浏览器,输入 URL 即可轻松的浏览整个版本库。灵活通常带来复杂性,Http 方式相对于 svnserve 方式来说需要更多的配置。
由于Subversion需要版本化的控制,因此标准的HTTP协议不能满足需求。要让Apache与Subversion协同工作,就要使用WebDAV(Web-based Distributed Authoring and Versiong)Web分布式创作和版本控制协议。WebDAV是HTTP 1.1的扩展。
1,安装apache,即httpd 服务。
2,确认加载一个特殊的模块mod_dav_svn。并测试apache可以正常启动。(以上两步已经通过yum安装过了)
- #cd /etc/httpd/modules
- #ls | grep svn
mod_authz_svn.so mod_dav_svn.so
3,设置 /etc/httpd/conf.d/subversion.conf
a. module的配置 一定要保证下面的两句话存在于配置文件中,否则无法在如svn的模块,就无法访问svn的仓库了: LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so b. 仓库目录配置 刚在上述已经配置了repos这个仓库目录 chown -R apache.apache repos(修改svn目录的属主为apache帐号,让apache用户拥有该仓库的所有权) 加入以下配置: <Location /repos> DAV svn SVNPath /home/svntest/repos AuthType Basic # 使用基本认证方式,即用户名、密码认证 AuthName "password for svn server" # 在认证对话框中出现的提示信息 AuthUserFile /home/svntest/repos/conf/pwdfile #指定上面创建好的存放用户名信息的文件路径 Require valid-user #限定只有用户输入正确的用户名和密码后才能访问该标签所指向的路径 </Location> c.下面建立可访问用户文件 htpasswd -c /home/svntest/repos/conf/pwdfile yhw 这句是交互式的,会让你输入密码。 d,重起Apache service httpd restart
4,用浏览器访问http://localhost/repos/,输入你刚才输入的用户名密码,就OK了。
5,进行目录访问控制
上面配置只能对Location标签内的路径执行某些动作时进行控制,若希望控制版本仓库中目录访问权限,需要利用mod_authz_svn模块。在上面的subversion.conf中,我们已经激活了该模块。
所以,接下来要做的,就是在Location标签中使用authz功能:
在Location标签中加入如下配置:AuthzSVNAccessFile /home/svntest/repos/conf/authz
其中,AuthzSVNAccessFile 指向的就是svnserve服务时使用的权限配置文件。每一段命名一个版本库和里面的路径,使用“认证用户(组)=权限”的方式描述每个用户(组)访问版本库的级别:r 是只读,rw是可读写,留空是不允许访问。另外,*表示所有用户,可以用于控制匿名用户的访问权限;@表示已经被分组的组名。具体的描述见svn server普通配置过程。
加入AuthzSVNAccessFile选项后,需要重启httpd服务以让其生效。但权限控制文件的内容修改后马上生效,是不需重启httpd服务。
Subversion目录说明:
*dav目录:是提供apache与mod_dav_svn使用的目录,让他们存储内部数据
*db目录:就是所有版本控制的数据存放文件
*hooks目录:放置hook脚本文件的目录
*locks目录:用来放置subversion见艰苦锁定数据的目录,用来追踪存取文件库的客户端
*format文件:是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号
*conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等)
Tips:
1,需要注意的是,http和svn方式访问svn的验证是两套不同的验证方式, 通过http访问的账号是Apache http验证的,而且是不需要启动svnserve服务的,一切都已经由dav模块做接口完成数据请求的工作,通过svn客户端以HTTP协议访问版本仓库即可。。 通过svn://访问的账号是svn仓库conf目录下passwd指定的。两个是独立的认证方式。
2,安装时,关闭iptables和selinux,否者会出现"Could not open the requested SVN filesystem"这样的问题
3,svn提交的时候,必须要先add,再commit
4,在使用svn commit的时候,如果不加-m参数,会出现如下错误:
svn: 提交失败(细节见下):svn: 无法使用外部编辑器取得日志信息;请尝试设定 $SVN_EDITOR 环境变数,或是使用 --message (-m) 或 --file (-F) 选项svn: 没有一个 SVN_EDITOR,VISUAL 或 EDITOR 环境变数被设定,执行时期的设定中也没有 ‘editor-cmd‘ 选项
原因是svn默认都是要填写注释的(空的也行),要你你使用-m填写注释,要么为svn执行对应注释编辑器,第二种对应的解决办法是:设置vim为你的SVM_EDITOR,对应的就是设置环境变量的方法。使用命令 export SVN_EDITOR=vim
参考:
http://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/#resources
http://www.ha97.com/4467.html