一、基本架构

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-commitpost-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. 工作流程

  1. 检出(Checkout)
    • 客户端从仓库下载最新版本到本地工作副本。
    • 工作副本包含.svn目录,记录版本元数据。
  2. 修改与提交(Commit)
    • 用户修改文件后,执行svn commit
    • 服务器验证权限,生成新版本号(如r101),存储差异。
  3. 更新(Update)
    • 客户端执行svn update,将本地副本同步到最新版本。
    • 自动合并远程修改,若冲突则提示用户解决。
  4. 分支与合并
    • 创建分支:svn copy trunk branches/feature1
    • 合并分支:svn merge ^/branches/feature1,解决冲突后提交。

3. 冲突解决

  • 冲突场景
    当多人同时修改同一文件的同一区域时,SVN检测到冲突。
  • 解决流程
    1. 用户执行svn update,发现冲突文件(生成.mine.rX.rY文件)。
    2. 手动编辑文件,保留所需内容。
    3. 标记冲突已解决:svn resolve --accept working file.txt
    4. 提交修改。

4. 钩子脚本(Hooks)

  • 作用
    在特定事件(如提交前、提交后)触发自定义脚本,实现自动化检查或通知。
  • 常用钩子
    • pre-commit:提交前检查代码格式、日志规范性。
    • post-commit:提交后触发CI/CD流程或发送邮件通知。

四、SVN与Git的对比

特性 SVN Git
架构 集中式(中央仓库) 分布式(每个用户有完整仓库)
版本号 全局递增整数 基于哈希的版本ID(如commit-id)
分支/合并 分支为目录复制,合并需显式操作 分支轻量,合并高效
离线操作 依赖网络(需连接服务器) 支持完全离线开发
性能 适合大文件、少量频繁提交 适合代码库,处理大量分支更高效

五、典型应用场景

  1. 企业代码管理
    • 集中控制代码版本,结合权限管理保障代码安全。
  2. 文档版本控制
    • 管理需求文档、设计稿等非代码文件的变更历史。
  3. 传统项目维护
    • 适用于已有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。理解其架构与原理有助于根据团队需求选择合适的版本控制工具。

posted on 2025-03-31 13:27  LeeHang  阅读(381)  评论(0)    收藏  举报