一、为什么需要版本控制

想象一下,你和团队正在开发一个项目,每个人都在修改代码。如果没有版本控制,可能会出现以下问题:

  1. 代码覆盖:小张刚改完的代码被小李不小心覆盖了
  2. 历史丢失:无法找回上周稳定运行的版本
  3. 协作困难:无法知道谁在什么时候修改了什么

SVN(Subversion)就是为解决这些问题而生的。它像一台时光机,可以:

  • 记录每次代码改动
  • 随时回退到任意版本
  • 支持多人协作开发

二、搭建SVN服务器

2.1 安装SVN服务端

以Linux系统为例(技术栈:CentOS 7 + SVN 1.7):

# 安装SVN
yum install -y subversion

# 创建版本库目录
mkdir -p /var/svn/repos

# 初始化仓库
svnadmin create /var/svn/repos/project1

# 查看生成的目录结构
tree /var/svn/repos/project1
# 会看到conf/ db/ hooks/等目录

2.2 配置用户权限

编辑/var/svn/repos/project1/conf/svnserve.conf

[general]
anon-access = none  # 禁止匿名访问
auth-access = write  # 授权用户可写
password-db = passwd  # 使用passwd文件认证

编辑/var/svn/repos/project1/conf/passwd

[users]
zhangsan = 123456  # 用户名=密码
lisi = abcdef

2.3 启动SVN服务

# 启动服务(默认端口3690)
svnserve -d -r /var/svn/repos

# 检查是否运行
ps aux | grep svnserve

三、日常开发操作指南

3.1 首次检出代码

假设服务器IP是192.168.1.100:

# 检出代码到本地(技术栈:Windows + TortoiseSVN)
svn checkout svn://192.168.1.100/project1 --username zhangsan

# 输入密码后会生成project1目录
# 这就是你的本地工作副本

3.2 提交修改

修改文件后:

# 查看变更状态
svn status

# 添加新文件
svn add new_file.py

# 提交到服务器(-m后面是提交注释)
svn commit -m "添加用户登录模块"

3.3 解决冲突

当多人修改同一文件时:

# 先更新本地代码
svn update

# 冲突文件会显示为:
# file.txt (冲突版本号)
# 用文本编辑器手动解决冲突后:

svn resolved file.txt  # 标记冲突已解决
svn commit -m "解决登录模块冲突"

四、企业级最佳实践

4.1 分支管理策略

推荐采用以下结构:

project1/
   ├── trunk/     # 主开发线
   ├── branches/  # 功能分支
   └── tags/      # 版本标记

创建分支示例:

# 从trunk创建2.0功能分支
svn copy svn://192.168.1.100/project1/trunk \
         svn://192.168.1.100/project1/branches/2.0-feature \
         -m "创建2.0功能分支"

4.2 钩子脚本应用

/var/svn/repos/project1/hooks/目录下:

# 创建pre-commit钩子(提交前检查)
cat > pre-commit <<'EOF'
#!/bin/sh
# 检查提交注释是否为空
if [ -z "$2" ]; then
  echo "提交注释不能为空!" >&2
  exit 1
fi
EOF
chmod +x pre-commit

五、SVN与Git的抉择

5.1 适用场景

适合用SVN的情况:

  • 需要严格的目录权限控制
  • 项目以二进制文件为主(如游戏资源)
  • 已有完善的CI/CD流程集成

5.2 注意事项

  1. 定期备份/var/svn/repos目录
  2. 大型项目建议按模块拆分仓库
  3. 使用svnadmin hotcopy进行热备份

六、总结

SVN作为集中式版本控制的代表:
✓ 优点:权限管理精细、学习成本低、与IDE集成好
✗ 缺点:依赖网络、分支操作较重

建议从这些方面入手实践:

  1. 先搭建测试环境熟悉流程
  2. 制定团队的提交规范
  3. 结合Jenkins实现自动化部署

记住:工具是为人服务的,选择适合团队现状的方案才是关键。当项目发展到需要分布式协作时,再考虑迁移到Git也不迟。