目录
四、配置多仓库
1. 多仓库的概念:
SVN 一个仓库(repository)对应独立数据库,仓库之间完全隔离。
2. 创建多仓库的步骤:
(1) 规划目录结构:
先创建一个仓库根目录(用来统一存放所有仓库)
# 创建总目录,所有仓库放在这里 mkdir -p /svn/repos说明:后续所有项目仓库,都作为 /svn/repos 的子文件夹。
(2) 使用 svnadmin create 创建单个仓库:
语法:svnadmin create 仓库完整路径
# 创建项目A仓库 svnadmin create /svn/repos/projectA # 创建项目B仓库 svnadmin create /svn/repos/projectB # 创建项目C仓库 svnadmin create /svn/repos/projectC执行完成后,projectA、projectB、projectC 各自独立,每个里面自动生成:conf、db、hooks、locks文件夹。
每个仓库有独立的svnserve.conf、passwd、authz;
每个仓库版本号独立、钩子独立;
(3) 启动svnserve(关键)
启动时,-r 指定总仓库父目录 /svn/repos,而不是单个仓库。
# svnserve -d(后台运行) -r(监管目录) /svn/repos(总仓库父目录) svnserve -d -r /svn/repos
-d 后台守护进程运行。 -r 指定仓库根目录,svnserve 会自动扫描该目录下所有子仓库。 (4) 访问地址:
svn://服务器IP/projectA svn://服务器IP/projectB svn://服务器IP/projectC(5) 分别配置每个仓库权限:
进入每个仓库各自的 conf 目录配置(具体权限配置方法见下一章节):
/svn/repos/projectA/conf/ /svn/repos/projectB/conf/每个仓库单独修改 svnserve.conf、passwd、authz,账号、权限互相独立。
3. 总结:
实现SVN多个仓库:在svnserve根目录下创建多个独立仓库目录,每个仓库自带 conf、db、hooks;仓库之间完全隔离、版本号独立;注意区分【多个独立仓库】和【一个仓库下多个项目文件夹】,后者不是多仓库。
五、SVN权限控制
仓库目录下 conf 文件夹包含3个核心文件:svnserve.conf(主配置)、passwd(账号密码)、authz(目录权限)。
1. 三个配置文件作用:
(1) svnserve.conf(主配置文件):
开启 / 关闭匿名访问、指定密码文件、权限规则文件
[general] anon-access = none # 匿名用户:read可读 / write读写 / none禁止访问 auth-access = write # 认证成功用户默认权限 password-db = passwd # 用户账号密码文件 authz-db = authz # 路径权限控制文件(细粒度目录权限) realm = 项目仓库名称(2) passwd:账号密码库,只保存用户名和密码:
[users] admin = 123456 zhangsan = 654321 lisi = 111111(3) authz:路径权限文件(最重要!),支持分组、目录授权:
权限可选值: rw 读 + 写(检出、更新、提交) r 只读(只能检出更新,不能提交) 空/无 完全禁止访问 语法:
[groups] # 定义用户组,@引用组 admin_group = admin dev_group = zhangsan,lisi # 多个用户间用逗号分开 #仓库根目录 [/] [/] @admin_group = rw @dev_group = r * = # 其他所有人禁止访问 # 仓库下/src目录,开发组可以读写 [/src] @dev_group = rw # 仓库下/doc目录,开发只能读 [/doc] @dev_group = r* 代表所有未匹配用户。
2. SVN(svnserve 模式)权限配置完整步骤:
(1) 进入仓库的 conf 目录:
如果是多仓库,每个仓库单独一套 conf,每个仓库要分别配置!
例:/svn/repos/projectA/conf(2) 修改 svnserve.conf(主配置文件,开启认证,关联另外两个文件):
打开 svnserve.conf,去掉前面注释#,修改下面配置:
[general] anon-access = none # 关闭匿名访问;可选read(匿名可读)/write(匿名读写)/none(禁止匿名) auth-access = write # 登录成功的用户默认权限 password-db = passwd # 指定账号密码文件(相对conf目录) authz-db = authz # 指定目录权限控制文件 realm = MySVNProject # 仓库提示名称,自定义注意:等号两边的空格不能丢,#是注释,要删掉#才生效。
(3) 编辑 passwd 文件,添加用户账号和密码:
打开 passwd,在[users]下面增加账号:
格式:用户名 = 密码
[users] admin = 123456 zhangsan = abc123 lisi = 666888只负责存账号密码,不分配目录权限
(4) 编辑 authz 文件,配置分组 + 目录读写权限:
1) 打开authz,先定义用户组(可选,方便批量授权)
# 多个用户间用逗号分开。 [groups] admin_group = admin dev_group = zhangsan,lisi2) 配置仓库路径权限:
# 仓库根目录 / [/] @admin_group = rw @dev_group = r * = # 其他所有用户,无任何访问权限 # /src目录,开发组可读可写 [/src] @dev_group = rw # /doc目录,开发组只读 [/doc] @dev_group = r
权限取值: rw 读写(检出、更新、提交) r 只读(只能看,不能提交) 空 禁止访问 (5) 重启 svnserve 服务:
修改 svnserve.conf / passwd → 需要重启 svnserve 生效;
修改 authz(路径权限文件)→ 无需重启服务,实时生效;
(6) 客户端测试:
TortoiseSVN checkout,输入 svn 地址,输入账号密码验证权限。
3. 配置自动启动服务:
原理:Windows自带sc命令创建系统服务,必须管理员身份打开CMD;svnserve必须加--service参数(不能用-d)。
适用:多仓库场景,-r 填写仓库总父目录(所有仓库放在这个目录下)
(1) 确认路径:
svnserve.exe 路径:例如 C:\Program Files\TortoiseSVN\bin\svnserve.exe
仓库根目录(多仓库的父目录):D:\svn_repos
注意:如果路径带空格,整个 binpath 要用英文双引号包裹。
(2) 管理员CMD执行sc create注册服务:
sc create SVNService binpath= "C:\Program Files\TortoiseSVN\bin\svnserve.exe --service -r D:\svn_repos" displayname= "SVN版本库服务" depend= Tcpip start= auto
参数解释: SVNService 内部服务名称(自定义,启停命令用这个名字) binpath= 等号右边必须有空格! --service 以 Windows 服务模式运行(不能写 -d) -r 仓库根目录(多仓库场景填父目录) displayname 在 Windows 服务管理器显示的名称 depend= Tcpip 依赖 TCP/IP 协议,网络就绪后才启动 start= auto 开机自动启动 成功提示:[SC] CreateService 成功 (3) 启动服务:
# 启动服务命令: net start SVNService # 停止服务命令: net stop SVNService(4) 验证与防火墙:
打开服务面板:Win+R → 输入 services.msc,找到「SVN 版本库服务」,启动类型为自动。
防火墙放行 3690 端口(svnserve 默认端口,svn:// 协议)。
测试:客户端 TortoiseSVN checkout svn://本机IP/仓库名。
(5) 删除服务(需要卸载时):
sc delete SVNService4.创建启停服务的批处理文件:
(1) 启动服务:
# net start 服务名称 net start SVNService(2) 停止服务:
# net stop 服务名称 net stop SVNService(3) 删除服务:
# net delete 服务名称 net delete SVNService(4) 以上功能在实际项目开发中经常使用,所以可以封装为.bat批处理文件,效果如下:
六、钩子程序
1. 钩子程序的概念:
钩子是服务器仓库目录下 hooks 文件夹里的脚本程序,当发生提交、修改属性、锁定等事件时自动触发执行。
2. 钩子程序的种类:
钩子脚本放在服务端仓库 hooks 目录,是服务器钩子。
钩子程序分为三大类(共9种):
(1) 提交相关。
(2) 版本属性修改相关。
(3) 锁定解锁相关。见下表:
分类
钩子名称
触发时机
作用
能否阻断操作
典型用途
提交相关 start-commit
提交事务创建之前执行
可以校验用户是否允许提交。
可以阻断提交。
校验用户账号是否有权限提交仓库;简单黑名单控制,在提交一开始就拒绝用户
pre-commit
提交事务完成前(事务还没写入仓库)
校验本次提交
可以阻断提交
1.检查提交日志不能为空;2.禁止提交指定类型文件;3.校验代码格式/规范;
post-commit
提交成功完成之后,版本号已经生成
提交完成后的回调
不能阻断(已经提交成功)
1.发送邮件通知;2.自动部署代码;3.触发持续集成构建;
版本属性修改相关 pre-revprop-change
修改版本属性前(比如修改已经提交的 log 备注)
控制是否允许修改历史提交属性
可以阻断
SVN默认禁止修改历史提交日志;开启这个钩子,才允许修改提交备注。
post-revprop-change
修改版本属性成功之后
属性修改完成回调
不能阻断
历史日志被修改后,发送通知、记录审计日志。
锁定解锁相关 pre-lock
文件加锁之前
控制是否允许获取锁定
可以阻断
控制锁定权限:限制哪些用户可以锁定文件;禁止对某些文件加锁。
post-lock
文件锁定成功之后
加锁完成回调
不能阻断
发送锁定通知,告知团队某人锁定了该二进制文件。
pre-unlock
解锁之前
控制解锁权限
可以阻断
校验解锁权限:不允许别人强行释放他人锁;防止随意抢锁。
post-unlock
解锁成功之后
解锁完成回调
不能阻断
发送解锁通知:通知团队文件锁已释放,可以编辑。
总结:
前缀 pre-:事件发生前,可以阻断操作;
前缀 post-:事件发生完成后,无法阻断;
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/inferno_lucerne/article/details/166994831






