SVN

一、SVN 核心概念

image-f10364cd

二、SVN vs Git 核心区别

特性 SVN Git
架构 集中式 分布式
仓库 单一服务器 每人完整副本
提交 需要联网 可离线提交
分支 目录拷贝(重量级) 轻量级指针
版本号 递增整数(r1, r2...) SHA-1 哈希
权限控制 精细到目录/文件 仓库级别

三、基础命令速查

仓库与工作区

# 检出仓库(建立工作副本)
svn checkout https://svn.example.com/repos/project ./myproject
svn co https://svn.example.com/repos/project/trunk ./myproject  # 只检出 trunk

# 查看仓库信息
svn info
svn info https://svn.example.com/repos/project

# 查看状态
svn status           # 本地修改状态
svn status -v       # 详细信息(含版本号)
svn status -u       # 对比服务器最新版本

获取更新

# 更新工作副本
svn update          # 更新到最新版本
svn update -r 100   # 更新到指定版本
svn up              # 简写

提交变更

# 添加文件到版本控制
svn add newfile.txt
svn add newdir/        # 添加目录(递归)
svn add *.java           # 通配符

# 删除文件
svn delete oldfile.txt
svn rm oldfile.txt     # 简写

# 提交
svn commit -m "提交说明"
svn ci -m "fix: 修复登录bug"   # 简写

查看历史与差异

# 查看日志
svn log                    # 所有历史
svn log -l 10              # 最近10条
svn log -r 100:200         # 指定版本范围
svn log -v                 # 详细(含文件列表)

# 查看差异
svn diff                   # 与基础版本比较
svn diff -r 100            # 与版本100比较
svn diff -r 100:200        # 两个版本间差异
svn diff file.txt          # 指定文件差异

四、分支与标签

SVN 标准目录结构

repository/
├── trunk/          # 主开发线
├── branches/       # 功能/修复分支
│   ├── feature-login/
│   └── hotfix-v1.2/
└── tags/           # 发布快照(只读)
    ├── v1.0/
    └── v2.0/

分支操作命令

# 创建分支(从 trunk 复制)
svn copy https://svn.example.com/repos/trunk \
         https://svn.example.com/repos/branches/feature-login \
         -m "创建登录功能分支"

# 切换到分支
svn switch https://svn.example.com/repos/branches/feature-login

# 查看当前分支
svn info | grep URL

# 合并分支到 trunk
cd trunk工作副本
svn merge https://svn.example.com/repos/branches/feature-login
svn commit -m "合并 feature-login 分支"

# 查看合并信息
svn mergeinfo https://svn.example.com/repos/branches/feature-login

# 创建 Tag(发布快照)
svn copy https://svn.example.com/repos/trunk \
         https://svn.example.com/repos/tags/v1.0 \
         -m "发布 v1.0 版本"

五、冲突处理

# 更新时遇到冲突,会生成以下文件:
# file.txt          ← 含冲突标记的文件
# file.txt.mine     ← 你的本地版本
# file.txt.r100     ← 旧的基础版本
# file.txt.r101     ← 服务器最新版本

# 手动解决冲突后标记为已解决
svn resolve --accept=working file.txt

# 快速解决:选择哪个版本
svn resolve --accept=mine-full file.txt    # 用本地版本
svn resolve --accept=theirs-full file.txt  # 用服务器版本

# 放弃本地修改,恢复到服务器版本
svn revert file.txt
svn revert -R .    # 递归恢复所有修改

六、状态符号说明

符号 含义
M 已修改 (Modified)
A 已添加 (Added)
D 已删除 (Deleted)
C 冲突 (Conflict)
? 未纳入版本控制
! 文件丢失
I 被忽略 (Ignored)
R 已替换 (Replaced)
X 外部引用

七、常用进阶操作

# 设置忽略文件(类似 .gitignore)
svn propset svn:ignore "*.class" .
svn propset svn:ignore -F .svnignore .

# 查看属性
svn proplist
svn propget svn:ignore .

# 锁定文件(二进制文件防并发编辑)
svn lock image.psd -m "我在编辑此文件"
svn unlock image.psd

# 查看某版本的文件内容
svn cat -r 100 file.txt

# 查看远程目录结构
svn list https://svn.example.com/repos/
svn list -v  # 详细信息

# 导出(不含 .svn 目录)
svn export https://svn.example.com/repos/trunk ./export_dir

# 撤销已提交的版本(反向合并)
svn merge -r 105:104 file.txt   # 撤销 r105 的修改
svn commit -m "撤销 r105 的修改"

八、典型工作流程

image-d0643f5c

九、服务器搭建速览

# 方式1:svnserve(内置,轻量)
svnadmin create /opt/repos/myproject    # 创建仓库
svnserve -d -r /opt/repos              # 启动服务(默认端口3690)
# 访问:svn://hostname/myproject

# 方式2:通过 Apache(http/https,推荐生产)
# 配置 mod_dav_svn 模块

# 配置用户权限
vi /opt/repos/myproject/conf/svnserve.conf
vi /opt/repos/myproject/conf/passwd
vi /opt/repos/myproject/conf/authz

十、快速参考卡片

常用命令助记:
co  = checkout    检出
up  = update      更新
ci  = commit      提交
st  = status      状态
di  = diff        差异
rm  = delete      删除
mv  = rename      重命名

黄金工作流:
update → 修改 → add/delete → diff确认 → commit

💡 学习建议

  1. 先掌握 checkout → update → commit 基础循环
  2. 再学会处理冲突(团队协作核心)
  3. 理解 trunk/branches/tags 结构
  4. 推荐工具:TortoiseSVN(Windows图形界面)、Subclipse(Eclipse插件)、IDEA内置SVN支持

项目分区导航贡献代码到开源项目从Fork到PR ⬅️ | 08-SVN(本组末篇)➡️ 00-Linux总览