首先安装必要包,初始化目录:
sudo apt-get install apache2 libapache2-svn subversion
sudo mkdir /home/svn
创建svn项目:
sudo svnadmin create /home/svn/Medusa
启动svn服务:
svnserve -d -r /home/svn
现在可以本地访问了:
cd ~/Tmp/
svn co svn://localhost/Medusa
但是不能commit,如:
cd Medusa
touch localtest && svn add localtest
svn ci -m 'local test'
svn: 提交失败(细节如下):
svn: 认证失败
这是因为没设置用户访问权限,于是sudo编辑3个文件,例如:
cd /home/svn/Medusa/conf
- 打开svnserve.conf,把:
anon-access = read auth-access = write password-db = passwd authz-db = authz
前面的注释删掉
-
打开passwd,
[users]
下面添加:lambda-svn = 123456
意思是添加一个svn的用户(不是linux系统用户)lambda-svn,密码为123456
-
打开authz,
[groups]
下面添加:[/] lambda-svn = rw * =
其中/表示项目根目录/home/svn/Medusa?
下面一句表示用户lambda-svn可以读写这个目录的所有文件,
* =
表示其他所有用户什么也不能干。
现在再来测试下(注意不要把svnserve kill掉):
-
测试本地提交:
cd ~/Tmp/Medusa/ svn ci -m 'local test'
提示输入用户名密码时输入lambda-svn和123456,然后出错:
svn: 不能打开文件“/home/svn/Medusa/db/txn-current-lock”: 权限不够
这次的错误和第一次提交时的错误不同了,先不管,看下一个测试。
-
测试重新checkout:
cd .. svn co svn://localhost/Medusa Medusa1
发现是可以的,这是因为svnserve.conf中设置了
anon-access = read
,即匿名用户可以读。注意,虽然authz里面写了* =
,但是匿名用户仍然所可以访问的,要令匿名用户也不可已读的话需要吧svnserve.conf中设置了anon-access = none
。(我想应该是这样,但是我测试了一下貌似设置了none之后还是可以匿名访问。。。狂汗一个= =|||
)而authz里面的设置只是针对认证用户,即passwd里面设定的用户。
现在来解决权限不够的问题,原因在于我们是用当前系统用户(假定为current-user)创建的svnserve进程,而current-user对/home/svn/Medusa/db/txn-current-lock没有写的权限。解决这个问题有两个方法:
-
使用超级管理员身份来启动svnserve:
sudo svnserve -d -r /home/svn
这个方法非常简单快捷
但是不知到会不会出漏洞?
-
令current-user对/home/svn/Medusa/db/txn-current-lock有写权限。这个方法非常繁琐,自己也没真正弄清楚,还是下次重新看看Unix高级环境编程再说了。
这样之后,在本地是可以co和ci了,但是远程还是不行。需要设置/etc/apache2/mods-available/dav_svn.conf,在最后加上:
<Location /Medusa>
DAV svn
SVNPath /home/svn/Medusa
AuthType Basic
AuthName "Medusa"
AuthUserFile /home/svn/Medusa/conf/passwd
# 如果想每次登陆都输入密码请把这个标签对引掉
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
然后貌似要重启apache服务:sudo service apache2 restart
, 就可以了。