一、基本架构
SVN采用客户端-服务器(C/S)模型,架构分为三部分:
1. 仓库(Repository)
- 作用:
存储所有文件的历史版本、元数据(如提交日志、权限配置)。 - 存储结构:
- 版本号(Revision Number):全局递增的整数,标记每次提交(如r1、r2)。
- 文件系统:基于BDB(Berkeley DB)或FSFS(文件系统存储)存储版本差异。
- 访问方式:
- 本地访问:直接操作文件系统(
file://协议)。 - 远程访问:通过HTTP/HTTPS(Apache模块)或SVN协议(
svn://)访问。
- 本地访问:直接操作文件系统(
2. 客户端(Client)
- 工具:
- 命令行工具
svn。 - 图形化工具(如TortoiseSVN、SmartSVN)。
- 命令行工具
- 功能:
- 与仓库交互(提交、更新、合并等)。
- 本地工作副本(Working Copy)管理。
3. 服务器(Server)
- 服务类型:
- svnserve:轻量级SVN协议服务(默认端口3690)。
- Apache + mod_dav_svn:通过HTTP/HTTPS提供WebDAV服务,支持更复杂的权限控制。
- 职责:
- 处理客户端请求(如提交、更新)。
- 管理仓库权限(通过
authz文件或Apache权限模块)。
二、核心组成
1. 仓库结构
- 标准目录布局(约定俗成,非强制):
/trunk # 主开发分支,存放当前稳定代码 /branches # 功能分支,用于开发新功能或修复Bug /tags # 标签,保存重要版本快照(如v1.0.0) - 元数据:
.svn目录(工作副本中):存储本地版本信息、差异记录。hooks目录(仓库中):自定义脚本(如pre-commit、post-commit)。
2. 客户端命令
- 基础操作:
svn checkout:从仓库检出工作副本。svn commit:提交本地修改到仓库。svn update:同步仓库最新版本到本地。
- 分支管理:
svn copy:创建分支或标签。svn merge:合并分支差异。
- 历史查询:
svn log:查看提交历史。svn diff:对比版本差异。
3. 权限与认证
- 认证方式:
- 用户名密码(
passwd文件)。 - SSH密钥(通过
svn+ssh协议)。 - LDAP/AD集成(需Apache配置)。
- 用户名密码(
- 权限控制:
authz文件定义用户/组对目录的读写权限。
三、工作原理
1. 版本管理机制
- 全局版本号:
- 每次提交生成唯一的全局版本号(如r100),所有文件共享同一版本号。
- 版本号递增,历史版本不可修改(可通过钩子脚本限制)。
- 差异存储:
- FSFS格式:每个版本存储与前一个版本的差异(节省空间)。
- 支持二进制文件的增量存储。
2. 工作流程
- 检出(Checkout):
- 客户端从仓库下载最新版本到本地工作副本。
- 工作副本包含
.svn目录,记录版本元数据。
- 修改与提交(Commit):
- 用户修改文件后,执行
svn commit。 - 服务器验证权限,生成新版本号(如r101),存储差异。
- 用户修改文件后,执行
- 更新(Update):
- 客户端执行
svn update,将本地副本同步到最新版本。 - 自动合并远程修改,若冲突则提示用户解决。
- 客户端执行
- 分支与合并:
- 创建分支:
svn copy trunk branches/feature1。 - 合并分支:
svn merge ^/branches/feature1,解决冲突后提交。
- 创建分支:
3. 冲突解决
- 冲突场景:
当多人同时修改同一文件的同一区域时,SVN检测到冲突。 - 解决流程:
- 用户执行
svn update,发现冲突文件(生成.mine、.rX、.rY文件)。 - 手动编辑文件,保留所需内容。
- 标记冲突已解决:
svn resolve --accept working file.txt。 - 提交修改。
- 用户执行
4. 钩子脚本(Hooks)
- 作用:
在特定事件(如提交前、提交后)触发自定义脚本,实现自动化检查或通知。 - 常用钩子:
pre-commit:提交前检查代码格式、日志规范性。post-commit:提交后触发CI/CD流程或发送邮件通知。
四、SVN与Git的对比
| 特性 | SVN | Git |
|---|---|---|
| 架构 | 集中式(中央仓库) | 分布式(每个用户有完整仓库) |
| 版本号 | 全局递增整数 | 基于哈希的版本ID(如commit-id) |
| 分支/合并 | 分支为目录复制,合并需显式操作 | 分支轻量,合并高效 |
| 离线操作 | 依赖网络(需连接服务器) | 支持完全离线开发 |
| 性能 | 适合大文件、少量频繁提交 | 适合代码库,处理大量分支更高效 |
五、典型应用场景
- 企业代码管理:
- 集中控制代码版本,结合权限管理保障代码安全。
- 文档版本控制:
- 管理需求文档、设计稿等非代码文件的变更历史。
- 传统项目维护:
- 适用于已有SVN基础设施的老旧项目迁移或维护。
六、部署示例(CentOS 7)
1. 安装SVN服务器
yum install -y subversion
svnadmin create /var/svn/repo # 创建仓库
2. 配置svnserve服务
# 编辑配置文件
vi /var/svn/repo/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
3. 启动服务
svnserve -d -r /var/svn/
4. 客户端检出
svn checkout svn://192.168.1.10/repo --username=user1
七、总结
SVN通过集中式架构简化了版本管理流程,适合需要严格权限控制和简单分支策略的场景。其核心优势在于易用性和对非代码文件的支持,但在分布式协作和高效分支管理上弱于Git。理解其架构与原理有助于根据团队需求选择合适的版本控制工具。
浙公网安备 33010602011771号