搭建SVN服务器这事儿,说难不难,说简单吧,配置里还真有几个容易翻车的坑。今天就把完整步骤和关键细节捋一遍,顺便把那些容易栽跟头的地方重点圈出来。
第一步:创建仓库
先用命令创建一个存放代码的目录,比如我打算把仓库放在 /home/svn/reins:
svnadmin create /home/svn/reins
创建完之后,记得顺手改一下文件所有者,否则后面服务跑起来可能权限不够:
chown -R svn:svn /home/svn/reins
这一步没什么花样,但容易忘记改权限,习惯性写好。
第二步:修改三个关键的配置文件
仓库创建好之后,真正的重头戏在配置上。SVN的所有用户、权限、服务参数都集中在仓库目录下的 conf/ 文件夹里,三个文件分别是:passwd、authz、svnserve.conf。下面一个一个说清楚。
1. passwd:定义用户和密码
这个文件最简单,直接照着例子写就行。格式就是 用户名 = 密码,注意组的概念后面再说,这里只填用户和密码:
[users]
p1_admin1 = p1_admin1
p1_d1 = p1_d1
密码在明文中,所以别拿生产环境的强口令来折腾——SVN本身设计就不考虑加密传输,这层安全得靠SSH或翻跟斗补。
2. authz:控制读写权限——这里特别容易翻车
authz 文件负责定义每个用户或组能访问哪些目录、权限是只读还是读写。配置的时候,一定要看清楚svnserve启动时 -r 参数指向的是哪个目录,因为这个参数直接决定了权限路径该怎么写。很多新手(包括我自己)就在这儿卡过——路径写错,一访问就报授权失败。
具体有两种常见情形:
情形A:单库svnserve方式(-r直接指定到版本库)
假设你的库 project1 放在 D:\svn\project1,启动命令是:
svnserve -d -r D:\svn\project1
这种情况下,svnserve只服务这一个库,URL里不需要带库名,直接 svn://192.168.0.1/ 就能访问。因此在 authz 文件里,路径就不能写成 [project1:/],而要写成 [/],因为此时根目录就是库的根目录:
[groups]
admin=user1
dev=user2
[/]
@admin=rw
@doc=r
如果你写成 [project1:/],系统会认为你要访问一个叫 project1 的库,但当前服务根本没有“库”这个概念,所以直接报错。这点务必注意。
情形B:多库svnserve方式(-r指定到版本库的上级目录)
还是 project1,但假设它的上级是 D:\svn,启动命令:
svnserve -d -r D:\svn
这时候一个svnserve可以服务多个库(比如 project1 和 project2),URL需要带上库名,例如 svn://192.168.0.1/project1。权限路径就要明确指定是哪个库的哪个目录:
[groups]
admin=user1
dev=user2
[project1:/]
@admin=rw
@doc=r
如果这时候你仍然用 [/],那它指的是所有库的根目录(也就是对所有库生效),可能不是你想要的。同理,[/src] 表示所有库根目录下的 src 目录。所以启动参数不同,authz里的写法天差地别,一定要先确定自己的启动方式再写。
3. svnserve.conf:服务主配置
这个文件里有一堆注释,需要你手动打开需要的选项。关键几点:
- 去掉
[general]前面的#号(注意,去掉后要顶格写,不能有空格,否则可能会报错) - 匿名访问权限:一般设为
none,防止不认证就能读取 - 认证用户权限:设为
write - 密码文件路径:指定
passwd - 授权文件路径:指定
authz
一个典型的配置长这样:
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
注意,password-db 和 authz-db 默认是相对路径,指向conf目录下的文件。如果你改了文件位置,需要写绝对路径。
第三步:启动SVN服务
假设你的仓库在 /home/svn/ 下(注意不是仓库本身,是上级目录,如果你想用多库方式的话),启动命令:
svnserve -d -r /home/svn/
-d 表示后台运行,-r 指定根目录。如果提示已经有svnserve进程在跑,可以用 killall svnserve 杀掉再重来。
这里也呼应前面的authz配置:如果你用的是多库方式,那么 -r 指向仓库的上级,authz里就要用 [库名:/];如果你只想启动单个库,可以直接 svnserve -d -r /home/svn/reins,authz里就写 [/]。总之这两边要匹配。
第四步:客户端访问
服务跑起来之后,客户端(比如TortoiseSVN)就能用地址 svn://172.31.12.38/reins 来checkout了。注意URL中的 reins 对应的是仓库名,前提是你启动时 -r 指定的是仓库的上级目录(多库方式)。如果你启动时直接指向了仓库本身,那URL就是 svn://172.31.12.38/,不带库名。
整体流程其实不复杂,但authz里的路径写法确实容易搞反。建议先在本地用小仓库测试一遍,确认权限生效了再上生产环境。另外,如果遇到 认证失败 或 授权失败 的错误,先检查svnserve.conf里的配置项有没有顶格写,再检查authz里的路径是否匹配启动参数。这两个是最常见的雷区。
