TortoiseSVN 从入门到精通:SVN 可视化客户端完全指南
一、SVN 是什么TortoiseSVN 又是什么1.1 SVN 简介SVNSubversion是一个集中式版本控制系统2000 年诞生至今仍是全球最流行的 VCS 之一。跟 Git 的核心区别维度SVN集中式Git分布式架构中心服务器 客户端每个人都是完整仓库网络依赖必须联网才能 commit/update离线也能 commitpush 需要联网提交历史只存在服务器每个人本地都有完整历史分支轻量但创建较慢瞬间创建锁机制✅ 支持文件锁❌ 不支持权限服务器端严格控制clone 后本地全权限典型场景企业内部权限可控、审计需求开源社区、个人项目为什么还有公司用 SVN集中式架构天然适合企业权限精确到目录、提交有完整审计日志、二进制文件图片/模型/文档版本管理更友好。金融、汽车、政府项目经常选用。1.2 TortoiseSVN 简介TortoiseSVN是 SVN 的Windows 图形化客户端——不是独立软件而是右键菜单集成到资源管理器里的。装上之后在任何文件夹上右键都能看到 TortoiseSVN 的菜单项不用开单独的应用程序窗口。这就是它叫乌龟的原因 —— 像小乌龟一样趴在 Windows 上随时待命。1.3 核心概念概念解释类比Repository仓库中央服务器上存代码的地方Git 里的远端仓库Working Copy工作副本你本地 checkout 下来的目录Git 里的本地 cloneRevision版本号服务器上每次提交的全局递增编号Git 里的 commit hashTrunk主线开发目录Git 里的 main/master 分支Branches分支目录Git 里的 feature branchesTags标签只读快照Git 里的 tagLock文件锁占住不让别人改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/二、安装 TortoiseSVN2.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 copyRename重命名文件SVN 能跟踪 renameGit 靠检测Delete标记删除下次 commit 才真删Cleanup清理锁文件、工作副本状态异常时用Properties设置文件/目录属性忽略、自动属性3.3 目录状态图标工作副本里的文件/文件夹会显示不同的图标叠加图标含义✅ 绿色对勾干净和服务器一致❗️ 红色感叹号已修改本地改了没 commit➕ 蓝色加号已添加本地新建了没 commit❌ 灰色叉号已标记删除 蓝色漩涡冲突本地和服务器都改了同一段 锁被你锁住了 锁被别人锁住了四、日常 8 大操作详解4.1 Checkout — 第一次拿代码场景拿到一个新项目第一次拉到本地。操作在想放代码的地方右键空白处不是某个文件夹上点TortoiseSVN → Checkout...填写URL of repository服务器地址如https://svn.company.com/project/trunkCheckout directory本地存放路径如D:\work\projectRevision默认 HEAD最新点 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 bugfix: 修复订单列表分页不生效 #1234更新refactor: 重构支付模块拆出 PayService规范type: 简短描述 关联任务IDType含义feat新功能fix修复 bugrefactor重构docs文档test测试相关chore构建/配置4.4 Add — 添加新文件场景新建了一个文件utils.h需要纳入版本控制。操作右键utils.h点TortoiseSVN → Add...确认弹窗里选的是对的文件点 OK文件图标变成蓝色加号还需要 Commit 才真正提交到服务器Add 只是本地标记新手常忘Add 之后必须再 CommitAdd 只是告诉 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窗口左侧是提交记录列表右侧是某次提交改了哪些文件双击某次提交里的文件能看 diffShow 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 分支BranchSVN 里分支就是服务器上的一个目录副本和 Git 轻量分支不同SVN 分支会复制整个目录树。创建分支项目根目录右键点TortoiseSVN → Copy...From当前项目trunk的 URLTohttps://svn.company.com/project/branches/feature-login填 Log message点 OK切换到分支项目根目录右键点TortoiseSVN → Switch...输入分支 URLhttps://svn.company.com/project/branches/feature-login点 OKTortoiseSVN 只更新差异部分很快合并回主干切回 trunkSwitch 到 trunk URL右键项目根目录 →TortoiseSVN → Merge...Merge a range of revisionsURL 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...Fromtrunk URLTohttps://svn.company.com/project/tags/v1.0OK标签一旦创建不能修改只能删了重建5.3 文件锁LockSVN 独有的功能独占修改我锁了这个文件别人就不能改别人会被通知文件被锁定。什么时候需要锁二进制文件PSD、模型文件、Excel—— SVN 无法自动合并二进制冲突多人同时改同一个文件即使是文本文件锁一下更安全锁定右键文件 →TortoiseSVN → Lock...填锁定原因点 OK文件图标显示解锁右键文件 →TortoiseSVN → Unlock...可以选 Unlockcommit 后自动解锁或 Steal lock抢占别人的锁需要权限被锁住的文件别人能做什么别人的操作能做吗ReadUpdate 拿到✅本地修改✅Commit 提交❌会被服务器拒绝提示文件被 XXX 锁定强制 commitSteal lock取决于权限六、冲突处理6.1 什么是冲突场景A 和 B 同事都 update 了最新版本然后都改了login.cpp的第 50 行附近。A 先 commitB 再 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 怎么解决方法 1TortoiseMerge 可视化解决推荐在冲突文件上右键→TortoiseSVN → Edit conflictsTortoiseMerge 打开左边是你的版本右边是服务器版本中间是合并结果点左边/右边的 ✅ 图标选择保留哪一行处理完保存关闭 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左侧选GeneralGlobal 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...→ 全选勾上 → OK7.3 Show Log 里搜索Show Log 窗口右上角有搜索框可以按作者、关键字、日期范围过滤提交记录。找 bug 时搜错误关键字特别好用。7.4 撤销已提交的代码场景某次 commit 有 bug要撤销那一次提交但不影响后面的提交。操作Show Log → 找到有问题的那次 commit右键→Revert changes from this revision工作副本里会应用反向补丁比如那次加了一行这次就删掉Commit这个反向修改 这是安全操作历史记录里不会真的删除那次提交而是新生成一次 commit 来抵消它。想真的删除历史记录比如密码泄露需要服务器端操作svnadmin dumpsvnadmin load普通用户做不了。7.5 Checkout 特定版本想看看昨天的代码长什么样Repo-browser → 找到目录右键→Checkout...Revision→ 选Revision→ 填版本号Show Log 里能看到或选Date→ 填时间点八、SVN vs Git什么时候选谁维度SVNGit网络依赖必须联网离线也能 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上次操作中断锁文件残留右键根目录 → CleanupConflict和服务器版本冲突手动解决 / TortoiseMerge 解决 → Resolved → CommitFile is locked by another user别人锁住了这个文件联系对方解锁或 Steal lock需要权限Repository moved permanently仓库地址变了右键根目录 → Relocate...填新地址Path is not a working copy这个目录不是 checkout 下来的换对目录或重新 CheckoutCould 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.htmlSVN 权限配置指南: https://svnbook.red-bean.com/en/1.7/svn.serverconfig.pathbasedauthz.html总结TortoiseSVN 的核心理念把 SVN 命令变成了右键菜单。记住这个等价关系SVN 命令行TortoiseSVN 菜单项svn checkoutCheckoutsvn updateSVN Updatesvn commitSVN Commitsvn addAddsvn revertRevertsvn logShow Logsvn lockLocksvn mergeMergesvn copyCopy创建分支/标签日常 80% 的时间只用 Update Commit Check for modifications 三个操作。剩下的分支/锁/冲突用到时再查本文或 Show Log 的右键菜单就好。TortoiseSVN 的学习曲线特别平缓—— 比 Git 简单多了。哪怕你从没接触过 SVN看完本文半小时内就能开始用。