一、SVN 是什么?TortoiseSVN 又是什么?
1.1 SVN 简介
SVN(Subversion)是一个集中式版本控制系统,2000 年诞生,至今仍是全球最流行的 VCS 之一。跟 Git 的核心区别:
| 维度 | SVN(集中式) | Git(分布式) |
|---|---|---|
| 架构 | 中心服务器 + 客户端 | 每个人都是完整仓库 |
| 网络依赖 | 必须联网才能 commit/update | 离线也能 commit,push 需要联网 |
| 提交历史 | 只存在服务器 | 每个人本地都有完整历史 |
| 分支 | 轻量但创建较慢 | 瞬间创建 |
| 锁机制 | ✅ 支持文件锁 | ❌ 不支持 |
| 权限 | 服务器端严格控制 | clone 后本地全权限 |
| 典型场景 | 企业内部(权限可控、审计需求) | 开源社区、个人项目 |
💡为什么还有公司用 SVN?集中式架构天然适合企业:权限精确到目录、提交有完整审计日志、二进制文件(图片/模型/文档)版本管理更友好。金融、汽车、政府项目经常选用。
1.2 TortoiseSVN 简介
TortoiseSVN是 SVN 的Windows 图形化客户端——不是独立软件,而是右键菜单集成到资源管理器里的。装上之后,在任何文件夹上右键都能看到 TortoiseSVN 的菜单项,不用开单独的应用程序窗口。
这就是它叫"乌龟"的原因 —— 像小乌龟一样趴在 Windows 上,随时待命。
1.3 核心概念
| 概念 | 解释 | 类比 |
|---|---|---|
| Repository(仓库) | 中央服务器上存代码的地方 | Git 里的远端仓库 |
| Working Copy(工作副本) | 你本地 checkout 下来的目录 | Git 里的本地 clone |
| Revision(版本号) | 服务器上每次提交的全局递增编号 | Git 里的 commit hash |
| Trunk | 主线开发目录 | Git 里的 main/master 分支 |
| Branches | 分支目录 | Git 里的 feature branches |
| Tags | 标签(只读快照) | Git 里的 tag |
| Lock | 文件锁(占住不让别人改) | Git 没有这个功能 |
1.4 SVN 仓库典型目录结构
https://svn.company.com/project/ ├── trunk/ ← 主线开发(日常写代码的地方) ├── branches/ │ ├── feature-login/ ← 登录功能分支 │ ├── feature-pay/ ← 支付功能分支 │ └── release-v1.0/ ← V1.0 发布分支 └── tags/ ├── v1.0/ ← V1.0 发布快照(只读) ├── v1.1/ └── v2.0/二、安装 TortoiseSVN
2.1 下载
官网下载页:https://tortoisesvn.net/downloads.html
- 选64-bit 版本(现在电脑基本都是 64 位)
- 下载
.msi安装包(约 15MB) - 可选下载Language Packs(中文语言包),如果看不懂英文界面
2.2 安装
双击.msi安装包,一路 Next 即可。没有坑,默认配置就好。
安装完成后:
- 不需要重启电脑(TortoiseSVN 是 shell 扩展,装完就生效)
- 新开一个资源管理器窗口,右键文件夹就能看到 TortoiseSVN 菜单了
2.3 可选:安装 TortoiseIDiff(差异对比工具)
TortoiseSVN 自带了文件差异对比,但 TortoiseIDiff 是专门的图片/二进制差异工具,做 UI 的同学推荐装。
三、界面导览:右键菜单全解
装好后,右键任意文件夹/文件,会看到 TortoiseSVN 的菜单项。下面按日常使用频率排序:
3.1 高频操作(80% 的时间用这 8 个)
| 菜单项 | 快捷键 | 作用 | 什么时候用 |
|---|---|---|---|
| Checkout | - | 从服务器拉代码到本地 | 第一次拿项目时 |
| Update | - | 从服务器拉最新代码 | 开始写代码前 / 下班前 |
| Commit | - | 把本地修改提交到服务器 | 写完功能后 |
| Add | - | 把新文件纳入版本控制 | 新建了文件/文件夹 |
| Revert | - | 放弃本地修改,恢复到服务器版本 | 改错了,想回退 |
| Show Log | - | 看提交历史 | 查谁改了什么 |
| Check for modifications | - | 看本地哪些文件改了 | 提交前自查 |
| Repo-browser | - | 浏览服务器仓库 | 看服务器上有什么 |
3.2 中频操作
| 菜单项 | 作用 |
|---|---|
| Lock / Unlock | 锁文件 / 解锁(独占修改) |
| Switch | 切换分支/目录 |
| Merge | 合并分支 |
| Copy | 创建分支/标签(= svn copy) |
| Rename | 重命名文件(SVN 能跟踪 rename,Git 靠检测) |
| Delete | 标记删除(下次 commit 才真删) |
| Cleanup | 清理锁文件、工作副本状态异常时用 |
| Properties | 设置文件/目录属性(忽略、自动属性) |
3.3 目录状态图标
工作副本里的文件/文件夹会显示不同的图标叠加:
| 图标 | 含义 |
|---|---|
| ✅ 绿色对勾 | 干净(和服务器一致) |
| ❗️ 红色感叹号 | 已修改(本地改了没 commit) |
| ➕ 蓝色加号 | 已添加(本地新建了,没 commit) |
| ❌ 灰色叉号 | 已标记删除 |
| 🌀 蓝色漩涡 | 冲突(本地和服务器都改了同一段) |
| 🔒 锁 | 被你锁住了 |
| 🔓 锁 | 被别人锁住了 |
四、日常 8 大操作详解
4.1 Checkout — 第一次拿代码
场景:拿到一个新项目,第一次拉到本地。
操作:
- 在想放代码的地方右键空白处(不是某个文件夹上)
- 点TortoiseSVN → Checkout...
- 填写:
- URL of repository:服务器地址,如
https://svn.company.com/project/trunk - Checkout directory:本地存放路径,如
D:\work\project - Revision:默认 HEAD(最新)
- URL of repository:服务器地址,如
- 点 OK,等进度条跑完
验证:打开本地目录,能看到和服务器一样的文件结构,文件夹图标上有绿色对勾。
4.2 Update — 拉最新代码
场景:早上来上班,先把最新代码拉下来;下班前再 update 一次确保没冲突。
操作:
- 在项目根目录右键
- 点SVN Update
- 等待完成
Update 输出解读:
A new_file.txt ← Added:服务器新增了这个文件 M modified_file.cpp ← Modified:服务器改了这个文件,更新到本地 D deleted_file.h ← Deleted:服务器删了这个文件 U your_file.c ← Updated:服务器版本和本地都改了,但自动合并成功 C conflict_file.c ← Conflict:同一段都改了,需要手动解决!4.3 Commit — 提交代码
场景:写完功能,要把修改推到服务器上。
操作:
- 在项目根目录右键
- 点SVN Commit...
- 在弹出的窗口里:
- Message:写提交说明(必填,好习惯)
- 勾选要提交的文件(默认全选已修改的)
- 点 OK
提交说明怎么写?
| 不推荐 | 推荐 |
|---|---|
| "改了点东西" | "feat: 新增用户登录功能" |
| "fix bug" | "fix: 修复订单列表分页不生效 #1234" |
| "更新" | "refactor: 重构支付模块,拆出 PayService" |
规范:<type>: <简短描述> <关联任务ID>
| Type | 含义 |
|---|---|
| feat | 新功能 |
| fix | 修复 bug |
| refactor | 重构 |
| docs | 文档 |
| test | 测试相关 |
| chore | 构建/配置 |
4.4 Add — 添加新文件
场景:新建了一个文件utils.h,需要纳入版本控制。
操作:
- 右键
utils.h - 点TortoiseSVN → Add...
- 确认弹窗里选的是对的文件,点 OK
- 文件图标变成蓝色加号
- 还需要 Commit 才真正提交到服务器(Add 只是本地标记)
💡新手常忘:Add 之后必须再 Commit!Add 只是"告诉 SVN 这个文件要管",Commit 才是"推到服务器"。
4.5 Revert — 放弃本地修改
场景:改错了一段代码,想恢复到服务器上的版本。
操作:
- 右键想回退的文件
- 点TortoiseSVN → Revert...
- 确认弹窗里选的是对的文件,点 OK
⚠️ 注意:Revert 会覆盖你本地的修改,而且不可恢复!如果想保留改动,先复制一份备份再 Revert。
4.6 Check for Modifications — 自查改动
场景:Commit 前先看看自己改了哪些文件,避免把不该提交的东西(临时文件、编译产物)也提交上去。
操作:
- 项目根目录右键
- 点TortoiseSVN → Check for modifications...
- 弹窗列出所有变更文件,双击可以看具体改了什么(diff 窗口)
4.7 Show Log — 看提交历史
场景:同事说"那个 bug 是昨天改的",想看看谁改了什么。
操作:
- 项目根目录右键
- 点TortoiseSVN → Show Log
- 窗口左侧是提交记录列表,右侧是某次提交改了哪些文件
- 双击某次提交里的文件,能看 diff
Show Log 里的常用操作:
| 操作 | 用途 |
|---|---|
| 右键某次提交 →Show revision | 看那次提交时文件的完整内容 |
| 右键某次提交 →Revert changes from this revision | 撤销那次提交 |
| 右键两次提交 →Compare revisions | 对比两个版本之间的差异 |
| 右键文件 →Blame | 逐行看每一行是谁什么时候改的 |
4.8 Repo-browser — 浏览服务器
场景:想看看服务器上有没有某个文件,或者不 checkout 就看看目录结构。
操作:
- 任何地方右键空白处
- 点TortoiseSVN → Repo-browser
- 输入仓库 URL
- 像浏览本地文件夹一样浏览服务器内容
常用操作:
| 操作 | 用途 |
|---|---|
| 右键文件 →Copy to working copy... | 单独拉某个文件到本地 |
| 右键目录 →Create branch... | 在服务器上直接创建分支 |
| 右键目录 →Create tag... | 在服务器上直接打标签 |
五、分支、标签、锁
5.1 分支(Branch)
SVN 里分支就是服务器上的一个目录副本(和 Git 轻量分支不同,SVN 分支会复制整个目录树)。
创建分支:
- 项目根目录右键
- 点TortoiseSVN → Copy...
- From:当前项目(trunk)的 URL
- To:
https://svn.company.com/project/branches/feature-login - 填 Log message,点 OK
切换到分支:
- 项目根目录右键
- 点TortoiseSVN → Switch...
- 输入分支 URL:
https://svn.company.com/project/branches/feature-login - 点 OK(TortoiseSVN 只更新差异部分,很快)
合并回主干:
- 切回 trunk(Switch 到 trunk URL)
- 右键项目根目录 →TortoiseSVN → Merge...
- Merge a range of revisions
- URL to merge from:分支 URL
- 点 Next → Merge → 处理冲突 → Commit
分支管理规范:
| 分支 | 用途 | 什么时候删 |
|---|---|---|
trunk | 主线开发 | 永远保留 |
branches/feature-xxx | 功能开发 | 合并到 trunk 后删 |
branches/release-v1.0 | 发布分支 | 发布稳定后保留或删 |
tags/v1.0 | 发布快照 | 永远保留(只读) |
5.2 标签(Tag)
标签是只读的目录快照,永远不变,用来标记"这个版本就是 V1.0"。
创建标签:
- 项目根目录右键→TortoiseSVN → Copy...
- From:trunk URL
- To:
https://svn.company.com/project/tags/v1.0 - OK(标签一旦创建,不能修改,只能删了重建)
5.3 文件锁(Lock)
SVN 独有的功能,独占修改:我锁了这个文件,别人就不能改(别人会被通知文件被锁定)。
什么时候需要锁:
- 二进制文件(PSD、模型文件、Excel)—— SVN 无法自动合并二进制冲突
- 多人同时改同一个文件(即使是文本文件,锁一下更安全)
锁定:
- 右键文件 →TortoiseSVN → Lock...
- 填锁定原因,点 OK
- 文件图标显示🔒
解锁:
- 右键文件 →TortoiseSVN → Unlock...
- 可以选 Unlock(commit 后自动解锁)或 Steal lock(抢占别人的锁,需要权限)
被锁住的文件别人能做什么:
| 别人的操作 | 能做吗 |
|---|---|
| Read(Update 拿到) | ✅ |
| 本地修改 | ✅ |
| Commit 提交 | ❌会被服务器拒绝,提示"文件被 XXX 锁定" |
| 强制 commit(Steal lock) | 取决于权限 |
六、冲突处理
6.1 什么是冲突
场景:A 和 B 同事都 update 了最新版本,然后都改了login.cpp的第 50 行附近。A 先 commit,B 再 update 时就会冲突 —— SVN 不知道保留谁的改动。
6.2 冲突长什么样
冲突文件里会出现特殊标记:
<<<<<<< .mine // B 的本地版本 int login_status = check_user(username, password); ======= // 服务器上 A 的版本 int login_status = authenticate(username, password, remember_me); >>>>>>> .r1234<<<<<<< .mine到=======之间:你的本地版本=======到>>>>>>> .r1234之间:服务器版本(r1234 是服务器的版本号)
6.3 怎么解决
方法 1:TortoiseMerge 可视化解决(推荐)
- 在冲突文件上右键→TortoiseSVN → Edit conflicts
- TortoiseMerge 打开,左边是你的版本,右边是服务器版本,中间是合并结果
- 点左边/右边的 ✅ 图标选择保留哪一行
- 处理完保存,关闭 TortoiseMerge
- 回到文件,冲突标记消失了
方法 2:手动编辑解决
直接在编辑器里把冲突标记删掉,手写最终代码:
// 删掉所有 <<<<<<< .mine / ======= / >>>>>>> 标记 // 手写合并后的代码 int login_status = authenticate(username, password, remember_me); check_user(username, password);解决完冲突后,必须:
- 右键冲突文件 →TortoiseSVN → Resolved(告诉 SVN 冲突解决了)
- Commit提交
6.4 预防冲突
| 做法 | 效果 |
|---|---|
| 功能拆分时按模块分工 | 不同人改不同文件,基本不冲突 |
| 每天至少 Update 一次 | 拉最新代码,减少和服务器版本差距 |
| 大文件(二进制)提前 Lock | 锁住了别人就不会同时改 |
| 提交前先 Check for modifications | 自查改动范围 |
七、实用技巧
7.1 设置忽略文件
编译产物、临时文件不该提交到服务器(每个开发机器都不一样)。
设置方式(两种都可以):
方式 A:全局忽略(对所有仓库生效)
- 任何地方右键空白 →TortoiseSVN → Settings
- 左侧选General
- Global ignore pattern里加:
*.o *.obj *.exe *.dll *.log *.tmp *.swp .DS_Store Thumbs.db node_modules/ dist/ build/
方式 B:目录属性设置(对当前仓库生效,推荐团队统一)
- 项目根目录右键→TortoiseSVN → Properties
- 点New→ 选svn:ignore
- 填入忽略的文件名/模式
- Commit 这个属性修改(它也是一次提交)
7.2 Cleanup 清理工作副本
场景:操作中断导致工作副本状态异常,或者锁文件残留。
操作:项目根目录右键→TortoiseSVN → Cleanup...→ 全选勾上 → OK
7.3 Show Log 里搜索
Show Log 窗口右上角有搜索框,可以按作者、关键字、日期范围过滤提交记录。找 bug 时搜错误关键字特别好用。
7.4 撤销已提交的代码
场景:某次 commit 有 bug,要撤销那一次提交(但不影响后面的提交)。
操作:
- Show Log → 找到有问题的那次 commit
- 右键→Revert changes from this revision
- 工作副本里会应用"反向补丁"(比如那次加了一行,这次就删掉)
- Commit这个反向修改
💡 这是安全操作,历史记录里不会真的删除那次提交,而是新生成一次 commit 来抵消它。想真的删除历史记录(比如密码泄露),需要服务器端操作
svnadmin dump+svnadmin load,普通用户做不了。
7.5 Checkout 特定版本
想看看"昨天"的代码长什么样:
- Repo-browser → 找到目录
- 右键→Checkout...
- Revision→ 选Revision→ 填版本号(Show Log 里能看到)
- 或选Date→ 填时间点
八、SVN vs Git:什么时候选谁?
| 维度 | SVN | Git |
|---|---|---|
| 网络依赖 | 必须联网 | 离线也能 commit |
| 仓库大小 | 小(只存当前版本+增量) | 大(每个人一份完整历史) |
| 分支 | 重(复制目录树) | 轻(瞬间创建) |
| 锁机制 | ✅ 原生支持 | ❌ |
| 二进制文件 | 友好 | 差 |
| 权限控制 | 精确到目录/文件 | clone 后本地无限制 |
| 学习曲线 | 平缓(概念少) | 陡峭(rebase/cherry-pick/stash 等) |
| 大文件 | 好(增量+可选 LFS) | 差(clone 慢,需要 LFS) |
| 冲突频率 | 较高(同一文件同时改) | 较低(分支+rebase) |
| 典型场景 | 企业内部、硬件/固件、文档管理 | 开源、互联网公司、个人项目 |
什么情况下选 SVN
- 公司规定用 SVN—— 别纠结,跟着公司走
- 硬件/固件项目—— 经常涉及二进制文件(固件、模型、PCB 文件),SVN 锁机制刚需
- 严格权限控制—— 不同部门只能看不同目录,SVN 的 authz 配置精确到位
- 文档管理—— SVN 天生适合管理 Word/Excel/PDF 等文档版本
什么情况下选 Git
- 互联网公司/开源项目—— Git 是事实上的标准
- 频繁创建分支—— SVN 分支是目录副本,重
- 离线开发—— 经常出差/没有内网
- 代码 review 文化—— GitLab/GitHub 的 MR/PR 生态比 SVN 成熟
💡现在还能同时用:很多团队 SVN 管文档+二进制,Git 管代码。或者用 SVN 的
svn-git插件互相转换。
九、常见报错与解决
| 报错 | 原因 | 解决 |
|---|---|---|
Authentication failed | 用户名/密码错,或权限没开 | 检查账号密码,让管理员开权限 |
Working copy is already locked | 上次操作中断,锁文件残留 | 右键根目录 → Cleanup |
Conflict | 和服务器版本冲突 | 手动解决 / TortoiseMerge 解决 → Resolved → Commit |
File is locked by another user | 别人锁住了这个文件 | 联系对方解锁,或 Steal lock(需要权限) |
Repository moved permanently | 仓库地址变了 | 右键根目录 → Relocate...填新地址 |
Path is not a working copy | 这个目录不是 checkout 下来的 | 换对目录,或重新 Checkout |
Could not connect to server | 网络问题 | 检查 VPN、服务器地址、防火墙 |
413 Request Entity Too Large | 上传的文件太大 | 让管理员调 Apache/Nginx 的LimitRequestBody |
十、速记表
| 日常操作 | 菜单路径 |
|---|---|
| 第一次拿代码 | 右键空白 → Checkout |
| 拉最新代码 | 右键根目录 → SVN Update |
| 提交代码 | 右键根目录 → SVN Commit |
| 添加新文件 | 右键文件 → Add → 再 Commit |
| 放弃修改 | 右键文件 → Revert |
| 自查改动 | 右键根目录 → Check for modifications |
| 看历史 | 右键根目录 → Show Log |
| 浏览服务器 | 右键空白 → Repo-browser |
| 创建分支 | 右键根目录 → Copy → 改 To URL |
| 切换分支 | 右键根目录 → Switch |
| 合并分支 | 右键根目录 → Merge |
| 锁文件 | 右键文件 → Lock |
| 解锁 | 右键文件 → Unlock |
| 冲突解决 | 右键文件 → Edit conflicts |
| 清理异常 | 右键根目录 → Cleanup |
| 撤销已提交 | Show Log → 右键 commit → Revert changes |
十一、延伸阅读
- TortoiseSVN 官方文档(最全): https://tortoisesvn.net/docs/release/TortoiseSVN_en/
- SVN 官方手册: https://svnbook.red-bean.com/(在线可读)
- 《SVN 实用指南》(中文,免费 PDF): http://www.svnchina.com/docs.html
- SVN 权限配置指南: https://svnbook.red-bean.com/en/1.7/svn.serverconfig.pathbasedauthz.html
总结
TortoiseSVN 的核心理念:把 SVN 命令变成了右键菜单。记住这个等价关系:
| SVN 命令行 | TortoiseSVN 菜单项 |
|---|---|
svn checkout | Checkout |
svn update | SVN Update |
svn commit | SVN Commit |
svn add | Add |
svn revert | Revert |
svn log | Show Log |
svn lock | Lock |
svn merge | Merge |
svn copy | Copy(创建分支/标签) |
日常 80% 的时间只用 Update + Commit + Check for modifications 三个操作。剩下的分支/锁/冲突,用到时再查本文或 Show Log 的右键菜单就好。
TortoiseSVN 的学习曲线特别平缓—— 比 Git 简单多了。哪怕你从没接触过 SVN,看完本文半小时内就能开始用。