本文的环境:
- centos 7.6
- svn 1.7.14
安装
yum install subversion
创建仓库
新建一个名为 test 的代码仓库
mkdir /var/svn/test
svnadmin create /var/svn/test
此时 test 目录的结构如下
drwxr-xr-x. 6 root root 86 2月 29 13:13 .
drwxrwxrwx. 8 root root 102 3月 9 11:09 ..
drwxr-xr-x. 2 root root 54 3月 9 09:24 conf
drwxr-sr-x. 6 root root 253 2月 29 13:45 db
-r--r--r--. 1 root root 2 2月 29 13:13 format
drwxr-xr-x. 2 root root 231 2月 29 14:01 hooks
drwxr-xr-x. 2 root root 41 2月 29 13:13 locks
-rw-r--r--. 1 root root 229 2月 29 13:13 README.txt
配置 svn
主要涉及配置文件都在 conf 中
passwd # 密码管理
authz # 权限管理
svnserve.conf # svn服务进程
管理用户(passwd)
用户和密码的格式为 name = password
,每行为一个用户,密码为明文。
添加一个账户名为 test,密码为123456 的用户:
[users]
test = 123456
配置权限 (authz)
[groups] # 分组配置
group1 = test
group2 = test1, test2
[/] # / 表示整个目录
test = rw # 读写权限
test1 = r # 只有读权限
test2 = w # 只有写权限
@group1 = rw # 分组 group1 内所有用户有读写权限
* = # 其它用户没有任何权限
服务配置(svnserve.conf)
打开下面 4 个注释
anon-access = read # 匿名用户无权访问
auth-access = write # 认证用户可读写
password-db = passwd # 指定用户认证密码文件
authz-db = authz # 指定权限配置文件
启动服务
# -d 服务后台运行
# -r 指定工作目录
# 注意这里不需要指定到具体哪个仓库 如 /var/svn/test
# 如需指定端口可以使用 --listen-port 3691
svnserve -d -r /var/svn
防火墙处理
svn 服务默认的是 3690
端口
firewall-cmd --zone=public --add-port=3690/tcp --permanent # 开启 3690 端口
firewall-cmd --reload # 重启
当然也可以直接关闭防火墙,但是不推荐使用
systemctl stop firewalld
客户端连接
客户端可以直接使用 svn://ip:3690/test 来 checkout test 仓库,默认端口可以忽略
配置 hook
自动检出
svn 服务端并不是以原文件来存储的,而是会以特殊的格式(FSFS,BDB)进行版本存储。所以如果我们需要直接在服务器中运行代码程序时需要先 checkout 检出代码,还是以test为例:
# 把 test 仓库的代码检出到 /var/www/test 目录
svn checkout svn://127.0.0.1/test /var/www/test
但是这样每次检出会很麻烦,使用 svn 的 hook 可以实现自动检出。
在 /var/svn/test/hooks
目录下新建一个 post-commit 文件,post-commit 文件添加内容为:
#!/bin/sh
EPOS="$1" # 仓库
REV="$2" # 版本号
export.UTF-8 # 编码
SVN=/usr/bin/svn # svn
WEB=/var/www/test # 要更新的项目目录
$SVN update $WEB --username test --password 1234567
为 post-commit 添加执行权限
chmod +x /var/project/test/hooks/post-commit
commit 限制
默认 svn 提交文件 commit 是没有限制,也就是说可以留空。但通常我们都会限制要求必须填写 commit,以免造成后面的混乱。修改 hook 中的 pre-commit 可以实现 commit 的限制
首先复制一份 pre-commit 文件
cp pre-commit.tmpl pre-commit
修改 pre-commit 文件
#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ "$LOGMSG" -lt 10 ];then
echo "提交失败: 注释不能低于10个字符" 1>&2
exit 1
fi
为 pre-commit 添加执行权限
chmod +x /var/project/test/hooks/pre-commit