SVN
一、SVN 核心概念
二、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 的修改"
八、典型工作流程
九、服务器搭建速览
# 方式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
💡 学习建议:
- 先掌握
checkout → update → commit基础循环- 再学会处理冲突(团队协作核心)
- 理解 trunk/branches/tags 结构
- 推荐工具:TortoiseSVN(Windows图形界面)、Subclipse(Eclipse插件)、IDEA内置SVN支持
项目分区导航:贡献代码到开源项目从Fork到PR ⬅️ | 08-SVN(本组末篇)➡️ 00-Linux总览
💬 评论