用 svnserve 建立 subversion 服务器
让我们来点真的吧
Part1 中介绍了在本机上建立 repo 自用,但如果想把 repo 放在网上供其他用户 checkout,则还需要架设 svn 服务器--这也是本文的目的。
svn 服务器可以用两种方法架设,一种比较简单,使用 svn 自带的 svnserve 实用程序,另一种直接利用 Apache 架设,需要加载额外的模块。svnserve 简单够用,我打算在这篇里先说说怎么用它架设 svn 服务器。
svnserve 就包含在 subversion 的程序包中,你的电脑上安装了 subversion 就自动有了 svnserve 这个小型 svn 服务器。这个服务器跟 Apache 这个巨无霸比起来简单轻便,使用自己的一套协议,访问时区别于 http:// 前缀,使用 svn:// 前缀。
用 svnserve 搭建 svn 服务器
我们要把 svnserve 运行起来,我将在例子中介绍具体的使用方法。
下面假设我在本机上运行 svnserve,IP 为 192.168.0.1,这个 svn 服务器为局域网内的电脑提供 svn 服务。我打算把 svn 服务器的访问地址设为 http://192.168.0.1/svnprojects/projectX,其中 X 为不同的多个项目。整个过程如下(以 windows 下为例):
首先确定 repo 在本机上的储存的位置,比如我准备把 repo 放在 D:\svnprojetcs\ 下,那么在命令行运行 svnserve -d -r d:\svnprojects 就可以了。其中 -d 参数让 svnserve 运行在后台,-r 参数限定了 repo 在网络上可以访问的地址。这样如果网络上其它的计算机要 checkout 这个服务器,只需要输入
svn checkout svn://192.168.0.1/project1
而 repo 在本机上实际的位置是 d:\svnprojects\project1。同理,如果想 checkout project2,则把上面的 project1 改成 project2 就可以了。
到此,一个简单的 svn 服务器就算是基本架设好了。但如果要正常使用,我们还需要设定用户的验证和相应的权限。
现在我们先建立一个叫 project1 的 repo,然后转到 project1中:
svnadmin create d:\svnprojects\project1
cd d:\svnprojects\project1
project1 目录下有一堆目录,进入 conf 并打开 svnserve.conf 这个文件,找到以下几行,并把前面的注解符号 ‘#’ 去掉,注意千万在每行的前面别留任何空格。
anon-access = read
auth-access = write
password-db = passwd
其中 anon-access 和 auth-access 分别为匿名和有权限用户的权限,默认给匿名用户只读的权限,这很好,我们不需要改它们。但如果想拒绝匿名用户的访问,只需把 read 改成 none 就能达到目的。password-db 后的 passwd 则为定义用户名及密码的文件路径。这个文件默认跟 snvserve.conf 在同一个目录,下面看看怎么配置 passwd 中的内容。
[user]
# harry = harryssecret
# sally = sallyssecret
harry 和 sally 这两行分别定义了可以对 repo 进行写入的用户的用户名和密码。我们可以在下面加上自己的用户名和密码,比如
testsvn = tester
这样就给了用户 testsvn 往 repo 中写的权限。存盘退出后,svn 服务器就算正式可以运行了!把所有需要管理的项目都放在 d:\svnprojects 这个目录下,像正常那样用 svnadmin create 命令建立 repo,如果要 checkout repo,则在命令行中输入:
svn checkout svn://192.168.0.1/project1
如果要 commit 刚需要输入刚才设置好的用户名和密码:
svn commit -m "we are commiting changes!" --username testsvn --password tester
给 Windows 用户的建议
如果你打算在 Windows 系统上运行 svnserve,只是简单的在命令行输入 svnserve -d -r d:\svnprojects 不是个好方法,一是每次都这么干太麻烦,二是服务器启动后为了保持它的运行,你必须让命令提示符窗口一直悬在桌面上,影响美观。最好是把 svnserve 作为系统的一个进程每次启动自动运行:
D:\> sc create svn
binpath= "D:\svn\bin\svnserve.exe --service -r D:\svnprojects"
displayname= "Subversion Server"
depend= Tcpip
start= auto
把当中的路径换成你的 svn 安装目录就可以了。
在 Apache 下建立 subversion 服务器
在 Apache 中部署 Subversion 实际上并不比用 svnserve 难多少,它的难点在于一般人没有修改 Apache 配置的权限,如果你有相应的修改权限,那么搭建一个 svn 服务器不是一件难事,我们来看看应该怎么配置。
准备工作
首先确定 Apache 正确安装,mod_dav 和 mov_dav_svn 这两个模块也被启用,在 Debian 系的 Linux 上可以这么安装:
sudo apt-get install apache2 subversion libapache2-svn
在 Windows 平台上,可以下载一个 XAMPP,Apache MySQL PHP 什么的就都有了。
确定 mod_dav 和 mod_dav_svn 被打开:
a2enmod dav dav_svn
基本设置
以上的准备工作做完后,就正式开始了,还是拿 part2 的机器网络环境,同样的例子。
我准备让 repo 的网络访问地址成为 http://192.168.0.1/svnprojects/projectX,
修改 /etc/apache2/conf 下的 httpd.conf,加入如下代码:
<Location /svnprojects>
DAV svn
SVNParentPath /path/to/svnprojects
</Location>
更多详细的<Location>命令用法请参见 Apache 手册,下同。SVNParentPath 命令用来把网络访问地址和 repo 的实际地址对应起来。
这样就设置完了,如果你把 repo 建立好了,现在就已经可以 checkout 了,输入:
svn checkout http://192.168.0.1/svnprojects/project1
设定用户的权限和验证
但这样肯定是不够的,因为还没有设定相应的用户权限,现在不管谁都可以往 repo 里塞东西,为了更好的控制,我们还需要设定访问权限,比如让指定的用户可以 commit,其他的只能 checkout。
因为我们在 Apache 上,所以访问权限的控制就可以直接借用 Apache 的,首先为你的用户设定用户名和密码:
htpasswd -cmb /path/to/passwdfile/passwords user1 test1
这样就把用户名和密码储存在 passwords 中了,加密方式为 MD5。如果需要添加新的用户,
htpasswd -mb /path/to/passwdfile/passwords user2 test2
以此类推。
然后回到我们在 httpd.conf 中添加的代码,修改一下:
<Location>
DAV svn
SVNParentPath /path/to/svnprojects
AuthType Basic
AuthName "Test Repository"
AuthUserFile /path/to/passwdfile/passwords
<LimitExcept GET PROPFIND OPTION REPORT>
Require valid-user
</LimitExcept>
</Location>
在这段代码的控制下,任何人都可以对 repo 进行 checkout,但只有 user1 和 user2 才可以 commit,<LimitExcept> 的作用是控制 HTTP 请求,如果 HTTP 请求是 GET PROPFIND OPTION REPORT 中的一种,则不需要去验证用户。
最后,你需要把 repo 所在的目录和文件的所有权都改成系统中操作 Apache 的用户,这样在 commit 的时候才会被 Apache 认可。在 Ubuntu 中,这个用户叫 www-data:
sudo chown -R www-data /path/to/repo
如果你用其它系统或是用 Windows,可以在 Apache 的配置文件中找到 User 这个命令来知道应该把目录的所有权交给谁。
以上就是一个初步的 Subversion 服务器的搭建,这一篇考虑到实际上用的人可能不多,要用的人估计肯定会自己配置,因此我写的不够细致,比如说没有说到基于 SSL 的设置步骤。