SVN学习笔记(二)

目录

四、配置多仓库

[1. 多仓库的概念:](#1. 多仓库的概念:)

[2. 创建多仓库的步骤:](#2. 创建多仓库的步骤:)

[3. 总结:](#3. 总结:)

五、SVN权限控制

[1. 三个配置文件作用:](#1. 三个配置文件作用:)

[2. SVN(svnserve 模式)权限配置完整步骤:](#2. SVN(svnserve 模式)权限配置完整步骤:)

[3. 配置自动启动服务:](#3. 配置自动启动服务:)

4.创建启停服务的批处理文件:

六、钩子程序

1.钩子程序的概念:

2.钩子程序的种类:


四、配置多仓库

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,lisi

  2. 配置仓库路径权限:

    仓库根目录 /

    [/]
    @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 SVNService

4.创建启停服务的批处理文件:

(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-:事件发生完成后,无法阻断;

相关推荐
传奇开心果编程1 小时前
【ArkUI进阶练中学】第12课:应用架构演进与遗留系统迁移
学习·ui·华为·harmonyos
我想我不够好。1 小时前
装一个纯净的系统
学习
海绵宝宝转agent2 小时前
leetCode100算法开源笔记分享
笔记·算法
小黄蚁2 小时前
使用LVGL模拟示波器创建正弦函数波形
单片机·学习
辣知2 小时前
辣知·化智71 四川广汉三星堆的金铜贝
学习
天天进步20152 小时前
90天AI接单学习路线:从LLM应用到AI Agent
人工智能·学习
vx_Biye_Design2 小时前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
91刘仁德3 小时前
Linux网络编程从入门到实战:UDP/TCP协议与socket编程全解析
linux·网络·笔记·tcp/ip·udp
@Mike@3 小时前
13-数据库学习笔记(查询执行处理模型)
数据库·笔记·学习