svnadmin:仓库管理工具,包括创建、修复和备份等操作。
svnlook:仓库查看工具,包括信息、日志和锁定状态等内容,不会造成仓库的改动。
svnserve:svn服务程序,允许通过svn网络协议来访问仓库。
svn:SVN客户端,用于访问仓库,对项目进行版本管理。
svnversion:客户端工具,用于查看本地拷贝的修订信息。
c. 创建仓库(Repository)
SVN 是以仓库为版本控制单位的,一个SVN服务器可以管理多个仓库,每个仓库拥有独立的修订号(REVISION),仓库中的任何一次更新都会带来修订号的递增。你可以根据需要选择建立一个或者多个仓库,这里,我以创建多个仓库为例子,假设我们将仓库都放到D:/SVN_REPOS目录下(该目录必须先建立),下面的命令将会在该目录下创建一个Test仓库:
(从命令行进入C:/Program Files/Subversion/bin下才能找到命令:)
svnadmin create D:/SVN_REPOS/Test
如果创建成功,D:/SVN_REPOS/下将会多一个Test目录。
2) 搭建svnserve访问方式
svn和http是两种并列的访问方式,你可以选择其中一种,也可以都采用。
a. 注册服务
为了让 SVNservice服务随windows系统一起启动,需将其注册为windows服务。命令:
sc create svnservice binPath= "/"C:/Program Files/Subversion/bin/svnserve.exe/" --service -r D:/SVN_REPOS" start= auto
(
其他形式:sc create SVN binpath= "/"C:/Program Files/Subversion/bin/svnserve.exe/" –service -r E:/www/svn" displayname= "SVN Service" depend= Tcpip start= auto
注意,binpath= depend= start= displayname= 等这些函数,等号后面需要有一个空格,binpath为svnserve.exe文件所在目录,将-d改成–service表示为使用服务启动。完成后需要到服务界面中启动,以后即为自动启动……
命令方式:svnserve -d -r D:/svn/repos默认端口是3690,如果不幸这个端口被别别的程序暂用,可以通过选项 --listem --port=绑定端口.
linux:
svn import /etc/svn/tmp/ file:///etc/svn/repos/ --message "init"
)
注意,上述命令均在一行中。sc.exe是Windows 2000以后系统自带的一个工具,2000下没有,可以从XP上拷过来。svnservice为服务名称,后面的参数格式有严格要求,等号前面没有空格而后面有。binPath本身带有多个参数,因此用引号括起来,而由于路径里面又有空格,因此又加上了一层引号。 --service和-r均为svnserve.exe的参数,前者要求它作为服务运行,后者指明了仓库的根路径(多仓库为仓库的父目录)。
带安装包的SVN会自动注册服务,这时我们可能需要修改-r参数,命令如下:
sc config svnservice binPath= "/"C:/Program Files/Subversion/bin/svnserve.exe/" --service -r D:/SVN_REPOS"
b. 访问
注册完后,通过运行sc start svnservice或者服务管理器(service.msc)启动服务。
接下来,我们就可以通过下面的命令来测试系统是否工作正常:
svn info svn://localhost/Test
如果正确的显示出仓库的相关信息,那么就大功告成了,否则请检查服务的参数是否配置正确,比如,如果未在服务参数中指定正确的-r值,就会得到如下错误:
No repository found in 'svn://localhost/Test'
如果安装了TortoiseSVN,则可以直接在浏览器中输入svn://localhost/Test,这样会调出TortoiseSVN的Repos-Browser。到此,你就可以通过TortoiseSVN来导入工程进行版本管理了(参见后文)。
c. 权限配置
在进行权限配置前,所有的用户都能进行任何操作,在很多情况下是不允许的。在创建仓库时,仓库目录下都会生成好几个文件夹,其中conf里面存储的是配置信息,包括三个文件:
authz:访问权限配置
passwd:用户名和密码配置
svnserve.conf:基本配置信息
先配置svnserve.conf,将里面几项配置前的注释去掉,最后的内容如下:
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
这些参数的含义文件里都有详细说明,其中,anon-access和auth-access分别是对匿名用户以及认证用户的访问控制,password- db指明用户密码文件路径,authz-db指明权限配置文件路径。另外还有一个参数realm用于指明仓库所属的认证域,默认情况下每个仓库位于不同的域(每个仓库有一个唯一的uuid),因此我们可以不设置该项,除非多个仓库需要共用同一份passwd配置。
passwd文件的配置很简单,格式如下(等号前面为用户名,后面为密码):
[users]
harry = 123
sally = 123
guest = 123
authz则可以创建用户组并精确配置某个用户或用户组对某个文件或目录的访问权限,下面是一个例子:
[groups]
harry_and_sally = harry,sally
[/]
* = r
[/project1]
* =
harry = rw
sally = r
[/project1/foo]
sally =
[/project2]
@harry_and_sally = rw
guest = r
文件内容其实很简单易懂,groups用于定义用户组,后面便是对资源的具体访问控制,/表示仓库根目录,*表示所有用户,用户组前面需加上@符号,r表示可读,w表示可写,等号右边为空则表示没有权限。注意对于目录结构,当用户访问某个资源时,SVN会先看有没有直接针对该资源的访问控制,如果没有找到,则会继承上一级目录的访问权限,如此递推。
再提一点,当我们有多个仓库时,我们会发现这些仓库的用户帐号在大多数情况下都是相同的,因此,我们可以将passwd文件放到公共的地方,然后将所有仓库的password-db配置都指向该文件。相应的,authz-db也可以共用一个文件,不过需要在配置具体的访问控制时指明所属的仓库,如下:
[/]
* = r
[repos1:/project1]
* = r
harry = rw
[repos2:/project1]
* = r
sally = rw
上述配置表明,所有人对所有仓库的根目录都有读权限,但只有harry对仓库repos1里的project1有读写权限,只有sally对仓库repos2里的project1有读写权限。
3) 搭建HTTP访问方式
SVN可以通过Apache实现Web访问方式,但这不是必需的,除非你有此需求。
a) 下载
Apache的官方网站为http://www.apache.org/,注意不要使用最新的2.2.x,而要选择2.0.x,这一点在SVN官方网站上有特别说明,当初我就没有注意到这一点,而导致Apache2.2启动时无法加载SVN的模块,出现“perhaps this is not an Apache module DSO”错误。
我下载的版本为apache_2.0.59-win32-x86-no_ssl.msi
b) 安装和注册
执行Apache安装程序。由于2.0的版本不会自动注册为服务,因此我们需要手工处理。运行cmd.exe,进入apache安装目录下的bin文件夹,执行如下命令即可:
apache -k install
更多的命令可以通过apache help查看。
注册完后,就可以通过系统托盘里的Apache Monitor来启动服务。如果80端口未被占用,那么服务器应正常启动,通过http://127.0.0.1就能看到Apache的测试页面。
c) 配置
Apache 是通过conf目录中的httpd.conf文件进行配置的,比如,默认的监听端口为80,在文件中搜索Listen 80,将80改成你所需的其它端口即可。配置完后必须重起Apache才能生效。更多关于Apache的配置说明请参见其帮助手册或google之。下面网站为帮助手册的中文版本。
为了让Apache支持SVN,比如增加一些配置项,一个典型的配置如下:
# 加载mod_dav模块,它是对WebDAV(Web-based Distributed Authoring and Versioning)协议的支持,由Apache自带
LoadModule dav_module modules/mod_dav.so
# 加载mod_dav_svn模块,它与mod_dav通信,使Apache支持SVN,它位于SVN的bin目录下。
LoadModule dav_svn_module "D:/Program Files/Subversion/bin/mod_dav_svn.so"
# 加载mod_authz_svn模块,用于进行权限管理
LoadModule authz_svn_module "D:/Program Files/Subversion/bin/mod_authz_svn.so"
# 配置SVN的访问路径以及相关相关参数
DAV svn # 必需
SVNParentPath D:/SVN_REPOS # 说明D:/SVN_REPOS下的所有目录均为仓库
SVNListParentPath on # 在网页中列出D:/SVN_REPOS下的所有仓库
AuthType Basic # 基本的用户名密码验证方式
AuthName "SVN REPOS" # 认证名称,作提示用
AuthUserFile D:/SVN_REPOS/users # 用户名密码文件
AuthzSVNAccessFile D:/SVN_REPOS/authz # 权限控制文件
Require valid-user # 只有通过认证才能访问网页
# 重定向处理,用于将http://HOST/svn地址重定向为http://HOST/svn/
RedirectMatch ^(/svn)$ $1/
下面对几个重要的地方作以说明:
i. 网上很多文章提到将mod_dav_svn.so和mod_authz_svn.so两个文件直接拷贝到Apache的modules目录下,当初我按照这种方法做时结果在一台Windows 2000 Server上无法启动Apache服务,为此折腾了半天。后来才明白,这些模块文件其实就是一些动态链接库,它需要依赖SVN的bin目录下的其它几个 dll文件(可以把后缀改为dll,然后通过VC带的depends查看其依赖关系),因此如果没有设置环境变量,那么Apache加载这些模块时就会失败,当然也可以把所有依赖文件(主要是libdb43.dll )拷贝过去。实际上,我们只需要通过绝对路径来引用这些模块即可,这样SVN升级后也不用再次拷贝。
ii. URL的访问路径为/svn/而不是/svn,因为后者可能有问题,导致通过http://HOST/svn访问出现如下错误信息
iii. SVNParentPath用于有多个仓库的情况,如果只有单个仓库,可以直接用SVNPath指明仓库路径。
iv. AuthUserFile指明用户名密码文件,但它与前面提到的SVN仓库下的passwd文件不是同一个文件,AuthUserFile是Apache 的认证文件格式,二者的区别主要是用户名和密码的分割符不同,passwd是等号,这里的users是冒号,当初我就是把它们当成一个文件而造成客户端无法访问(为什么SVN不把passwd的格式定义成和AuthUserFile的一样呢?这样二者可以共用一个文件)。如果要对密码加密,那么users 文件需通过Apache附带的htpasswd工具生成,实际上我们也可直接采用明文方式。
v. 权限控制文件AuthzSVNAccessFile与前面SVN里的authz一样,因此可以共用。
4) 其它管理功能
a. 备份
b. 修复
本人实践截图部分:
svn目录截图
权限截图
运行截图: