前言

本篇讲解如何在 Linux 服务器 CentOS 7 搭建 SVN 服务端,创建 SVN 仓库项目,添加项目成员以及配置用户权限。
我们将使用 svnserve 提供 svn 服务(另外还有 apache搭建SVN 方式)使用svnadmin创建仓库;

服务器上安装 Subversion

首先我们要安装 SVN 的服务端,Apache Subversion 提供了服务端和客户端。
如果你还没安装好 Subversion 请查看 SVN服务端安装教程

创建 SVN 仓库

为确保你已正确安装好 SVN ,请在命令行输入 svnadmin help,如果看到如下内容,说明是没问题的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# svnadmin help
general usage: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...]
Subversion repository administration tool.
Type 'svnadmin help <subcommand>' for help on a specific subcommand.
Type 'svnadmin --version' to see the program version and FS modules.

Available subcommands:
crashtest
create
delrevprop
deltify
dump
dump-revprops
freeze
help (?, h)
hotcopy
info
list-dblogs
list-unused-dblogs
load
load-revprops
lock
lslocks
lstxns
pack
recover
rmlocks
rmtxns
setlog
setrevprop
setuuid
unlock
upgrade
verify

svnadmin是一个服务端的 SVN 管理工具,我们可以用它来创建仓库。

我们的仓库通常都会有很多个,所以我们创建一个目录来存放,假设我以/root/repos/作为我的仓库父目录,执行下面的命令:

1
2
3
cd /root
# 创建目录
mkdir repos

接下来我们创建一个仓库test

1
2
3
4
5
6
7
# 先进去repos目录
cd repos
# 创建仓库test
svnadmin create test
# 进入仓库查看文件列表
cd test
ls

输出如下,表示创建成功,

几个关键目录介绍下
conf目录是存放配置文件的,配置用户权限,用户账号密码,svnserve配置都在这里配置。
db这里存放我们平常提交的数据文件,文件内容都是经过处理的,看不懂里面的内容
hooks这里是存放钩子配置的,暂时不用管这里

我们的重点是在conf目录,里面几个配置文件如下:
authz 是权限配置文件,用来配置用户什么路径有读写权限
hooks-env.tmpl 是钩子环境变量配置文件的模版,我们暂时用不到,可以忽略
passwd 用来配置用户的帐号密码
svnserve.conf 是subversion的总配置

现在我们什么配置都不用修改先,我们先启动 svn 服务:

1
2
3
4
5
6
7
# 启动svn服务,-d 表示在后台运行,-r 表示仓库根目录
svnserve -d -r /root/repos/
# 查看svn进程
ps -ef | grep svn
# 停止SVN服务进程
ps -aux | grep svn
kill -9 进程杀掉

如果没报错,说明就启动成功了。
这时候我们就可以使用 SVN 客户端来检出仓库了。如果你还不会使用 SVN 客户端,可以查看下 SVN使用教程
你会发现任何人都可以检出代码,但是无法提交代码,这是因为 svn 仓库默认就是未登录用户有读取权限。

接下来我们修改配置,限制只有登录用户才能检出代码,不然太危险了。

打开test/conf/svnserve.conf 文件,替换内容如下;

1
2
3
4
5
6
7
8
9
[general]
# 未登录用户无权限
anon-access = none
# 已登录用户有读写权限
auth-access = write
# 密码配置文件
password-db = passwd
# 权限配置文件
authz-db = authz

注意,这个文件里面有非常多的注释内容,我上面这个配置内容是简化后的,我们直接把原来的全部删除,替换为我们这个就行了。
保存配置后,不需要重启服务器,我们重新checkout下,这时候就会弹出登录界面了,说明配置生效了。

但是我们还没有用户名密码,接下来我们设置下用户名和密码。
打开test/conf/passwd文件,我们增加一个用户名hello,密码123456,最后内容如下:

1
2
3
4
[users]
# harry = harryssecret
# sally = sallyssecret
hello = 123456

这时候我们直接去 checkout 会提示没有权限Error Authorization failed
这是因为我们配置了authz-db = authz,这个表示用户的权限需要读取这个配置文件去判断。
如果我们去掉这个配置,则登录用户对整个仓库都有读写权限。

接下来我们给 hello 用户配置路径权限,打开test/conf/authz文件,写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 这是一个权限配置文件
# 每行配置一个权限
# 用$authenticated表示所有登录用户
# 用$anonymous表示所有未登录用户
# *号表示任何用

# 这里配置分组,把相同权限的人归为一个组,方便配置权限
[groups]
# 假设我们创建一个开发人员组
# developers = zhangsan,lisi
# 管理员分组
# admin = wangzong,ruhua

# 配置根目录权限,管理员分组有根目录的读写权限,hello用户只有读权限
[test:/]
@admin = rw
hello = r

# 给开发人员配置服务端源码路径的读写权限,hello有读写权限
[test:/server/src]
@developers = rw
hello = rw

把配置文件保存好,这样我们的hello用户就有了根目录/的读权限,并且有了/server/src的读写权限了。
另外我们还配置了几个分组,不过那些用户都是假的,需要在passwd文件里先配置这些用户才能使用,这里只是给你演示下如何配置分组

完整的 SVN 服务端搭建和配置就完成了,日常工作中,如果项目比较多、用户多,会需要经常修改配置文件,要多注意安全,不然容易导致仓库访问不到。