ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SVN入门教程:从安装到日常操作,30分钟上手集中式版本控制

SVN入门教程:从安装到日常操作,30分钟上手集中式版本控制 SVN这个老家伙到底还能干嘛大概是很多刚接触版本控制的同学心里最大的疑问。网上铺天盖地都是Git教程但打开不少公司的内部系统、外包协作平台甚至是游戏公司的美术资源库SVNSubversion依然是雷打不动的主力。我见过太多人一上来就啃Git结果实习第一天公司的代码仓库是SVN直接懵在原地。这篇教程我不扯废话从下载安装到日常提交、冲突解决、IDEA配置、权限管理一条线讲完目标是让你在30分钟内把最常用的SVN操作全部跑通直接能上手干活。适合完全没用过版本控制的新人也适合平时用Git、但被公司SVN流程困住的同学。1. 先搞清楚SVN是什么以及你为什么还在用它1.1 SVN没有死集中式与分布式的本质区别SVN全称是Apache Subversion属于集中式版本控制系统。集中式是什么意思就好比公司只有一个档案室所有文件的正式版本都存在档案室每个人要干活就去档案室把文件借出来改完之后再还回去档案室里的版本永远是唯一的权威版本。Git这类分布式版本控制系统就不一样每个人本地都有一份完整的仓库历史不用连服务器也能提交、查日志、建分支。SVN的本地工作副本只存放当前版本的内容和差异记录不保存完整历史所以离线状态下基本只能看看自己改了啥不能提交也不能查看历史记录。这个区别决定了SVN的很多行为习惯。比如你checkout出来的代码其实只是某个时刻的“快照”加本地改动真正重要的东西都在服务器上。理解了这一点下面讲的很多操作逻辑就顺了。1.2 什么样的项目适合选SVN而不是GitGit确实很强但SVN有些特性在实际工作环境中依然有不可替代的价值。我梳理了一下这几类场景选SVN是合理的权限控制要求细SVN可以在目录级别控制读写权限比如让后端看不到前端源码、只允许测试人员读取某些目录。Git虽然也能做权限控制但配置成本和粒度控制不如SVN直接。二进制文件多策划文档、美术设计稿、Unity素材包这类文件体积大、不方便文本合并SVN的目录锁定和文件锁定机制比Git更成熟之前在游戏公司用的就是Perforce和SVN搭配美术资源基本都走SVN。团队整体水平偏基础SVN的学习曲线比Git平缓很多没有任何版本控制基础的人教一遍checkout、update、commit就能上手。Git那套staging area、分支管理、rebase对刚接触的人来说太抽象了。存量系统与企业合规要求很多传统企业、政务系统的内部代码托管平台只支持SVN这跟技术选型没关系纯粹是基础设施已经定死了。当然如果你做的是开源项目、个人项目或者团队协作规模大、分支策略复杂那Git依然是更合适的选择。但把这篇文章当入门就算以后你用Git版本控制的核心思想也是一样的。2. 环境准备小乌龟安装、汉化和命令行补全Windows下用SVN绕不开TortoiseSVN这个客户端大家一般叫它“小乌龟”图标就是一只红色的小乌龟和系统资源管理器深度集成装完以后右键菜单里就会多出一堆SVN操作选项。2.1 下载与安装别漏掉command line client tools下载地址直接搜TortoiseSVN官网国内访问没有问题。版本选择现在比较大路的是1.14.2分32位和64位按系统选就行。安装过程基本就是一路Next但有一个选项很多人会忽略就是安装类型选择时最下面几个组件里有一个“command line client tools”默认是装不上的必须手动选上。这一步为什么这么重要因为IDEA的SVN插件、VSCode的SVN扩展本质都是调用svn命令行工具实现功能的。如果你没装command line toolsIDEA里配置SVN时会报错说找不到svn.exe或者一直提示“SVN is not configured properly”。很多同学在这个坑上卡了几个小时最后发现就是安装时少勾了一个东西。建议安装时在“Select Components”这一步把“command line client tools”整项选成“Will be installed on local hard drive”。2.2 汉化包安装与语言切换英文界面用不惯的话可以装汉化包。注意一个原则汉化包版本必须和TortoiseSVN版本严格对应比如你装的是TortoiseSVN 1.14.2就去找1.14.2对应的LanguagePack装错了会直接提示版本不匹配有时候能装但会随机崩溃。安装完语言包后在资源管理器任意位置右键选TortoiseSVN - Settings然后在左边的General选项里找到Language区域下拉框里选“中文(简体)”点确定再打开右键菜单就是中文了。2.3 用svn --version验证环境是否正常装完以后按WinR输入cmd然后执行svn --version --quiet如果输出一串版本号说明命令行工具就绪了。比如输出1.14.2那后面IDEA配置就直接填svn.exe的路径。顺便说一句在项目里任意位置右键如果能正常弹出TortoiseSVN菜单说明小乌龟本体也正常。小乌龟装完之后还有个常见现象文件图标的绿色小对勾、红色感叹号不显示。这是因为Windows对图标覆盖系统图标数量有限制或者系统缓存没刷新。处理方法是在TortoiseSVN的Settings - Icon Overlays里把Status cache改成“Shell”或“None”然后重启一下explorer.exe进程或者注销重新登录图标一般就出来了。3. 半小时主线任务建仓库、拉项目、第一次提交环境准备好之后我把整套流程压缩成一条主线你照着走一遍大概半小时以内就能建立对SVN的完整认知。3.1 服务端仓库创建VisualSVN Server或svnadmin先得有仓库。如果公司已经搭好了SVN服务器会给你一个仓库地址比如https://svn.example.com/repos/project这步可以跳过。但如果你想自己练手或者想搭一个团队内部仓库可以用VisualSVN Server这套图形化工具装完以后打开管理界面右键Repositories - Create New Repository填个名字就能建好操作和Windows资源管理器差不多。不想装图形工具的话也可以用命令裸建svnadmin create D:\Repositories\myproject这样就生成了一个仓库目录。但仓库建好之后还要配置conf目录下的svnserve.conf和passwd文件才能让别人访问。新手建议直接用VisualSVN Server它能省掉一堆配置文件的学习成本等理解了SVN工作流之后再去研究svnadmin命令也不迟。3.2 标准目录结构trunk、branches、tags一个规范的SVN仓库在建库之初就应该规划好三个顶层目录trunk主干日常开发的主战场大家提交的代码默认都进这里。branches分支用来放功能分支、发布分支比如开发一个大功能时开一个分支一段时间的改动都提交在分支上功能稳定后再合并回主干。tags标签通常用来做发布快照比如v1.0、v2.0发布时把当时的代码复制一份到tags目录作为不可动的版本存档。为什么要分这三个目录因为SVN本身没有“分支”“标签”的概念它只有目录拷贝。通过约定这三个目录团队就能用文件目录的形式模拟出分支和标签的管理方式。如果一整个项目文件直接扔在仓库根目录下后面想区分发布版本和开发版本就非常痛苦。3.3 Checkout把项目拉到本地拿到仓库地址后在本地想放置项目的目录下右键选择“SVN检出”Checkout输入仓库URL例如https://svn.example.com/repos/myproject点确定后TortoiseSVN会弹出检出进度窗口把服务器上的文件拉到你指定的本地目录。这一步的理解重点在于你得到的不只是一个文件副本还有一个隐藏的.svn目录。.svn目录就是SVN的工作副本元数据记录了文件版本、本地改动、与服务器版本的关系。这个目录不能删删了SVN就彻底不认识这个项目了。检出完成后文件夹上应该会出现一个绿色的对勾图标说明这个目录与服务器同步正常。3.4 第一次Commit理解工作副本和仓库的区别现在做一个最简单的练习。在检出的项目目录下新建一个文本文件比如readme.txt然后右键这个文件发现菜单里跟SVN相关的操作有很多但Edit和Commit是不可点的提示“新增”Add状态。这是因为SVN不会自动追踪新文件你必须先执行“Add”操作把文件纳入版本控制。右键 - TortoiseSVN - 添加Add文件图标会变成蓝色加号表示已经加入版本控制但还没有提交。接下来右键 - SVN提交Commit填写提交日志确认文件列表点确定。提交完成后这个文件才真正进入服务器仓库其他人Update之后就能看到。本地新建的文件如果不Add不Commit就永远只存在于你的电脑上其他人完全不知道。这一步你会直观感受到SVN的工作流程检出阶段是“从仓库拿代码”提交阶段是“把本地改动给仓库”本地工作副本和服务器仓库通过Update和Commit两个动作保持同步。平时说的“代码丢了SVN上还有一份”指的就是提交之后服务器上的那份备份。4. 日常开发四板斧Update、Commit、Add、Revert环境跑通之后你的日常开发就是围绕几个高频操作转。我把它们拆开来讲清楚顺便把容易踩坑的地方一并说明。4.1 Update vs Commit先更新再提交的纪律Update是把服务器上别人提交的最新代码拉到本地Commit是把自己的本地改动推送到服务器。理想模式下你的操作节奏应该是开始工作前先Update拿最新代码 - 改代码 - 改完Commit。很多新手最容易犯的一个错误是改了一整天代码不Update直接Commit然后SVN弹出一堆冲突和错误整个人就慌了。正确做法是提交之前先Update一下让本地代码尽可能和服务器对齐如果别人改了同一个文件你可以在Update时就发现问题处理冲突的成本远低于提交时才发现矛盾。顺带说一个提交纪律提交信息一定要写清楚。比如“修复用户登录时验证码过期的问题”就比“修改”两个字强一万倍。因为在SVN的日志窗口里提交信息是回看历史、定位问题的主要线索。我之前带团队时定的规矩是提交信息必须能回答“这个改动做了什么”和“为什么这么做”做不到的就打回重新写。4.2 Add新文件和Ignore不需要入库的文件前面讲了新文件必须执行Add才能纳入版本控制。但还有一种情况某些文件你永远不希望纳入版本控制。比如IDE生成的配置文件.idea、.vscode、*.iml编译输出目录bin、obj、target、node_modules本地配置.env、config.local.php、database.yml如果一个不小心把这些文件提交进仓库后面每个同事提交时都会看到一堆杂七杂八的文件变动非常恶心。所以要在项目刚建立时就配好忽略规则。操作方式有两种一种是在项目目录或文件上右键 - TortoiseSVN - 添加到忽略列表Add to ignore list。另一种是在TortoiseSVN的Settings - Subversion - 全局忽略样式Global ignore pattern里写通配符比如*.class *.log *.tmp .idea target node_modules全局忽略样式是对所有项目生效的适合个人习惯项目级别的.svnignore文件则用于团队统一规则。我个人的建议是全局忽略设一套公共的编译产物自动忽略规则项目里再配上.svnignore把团队约定放在版本控制里所有人都能共享。4.3 Revert和Cleanup手滑了怎么补救改错代码、文件被误删、提交后发现弄砸了这些场景SVN都有对应的补救方案。如果你只是改了本地文件但还没提交可以在文件上右键 - 还原Revert把文件还原到上次检出的状态。这个操作只影响本地工作副本不会影响服务器版本。如果你已经提交了但发现代码有问题可以右键 - TortoiseSVN - 显示日志Show log找到出问题的那个版本然后选择“从版本中还原变更”Revert changes from this revisionSVN会生成一个反向操作把该版本造成的改动撤销掉并生成一个新的提交。这个操作同样能在日志窗口里完成很方便。还有一个日常必备操作清理Cleanup。当SVN操作异常中断时比如提交到一半电脑断电、Update时卡死杀掉进程工作副本会被一个残留的Lock锁住之后再操作任何东西都会提示“Cleanup required”。这时候只需要右键项目目录 - TortoiseSVN - 清理Cleanup把残留锁和中断状态清掉就能继续操作了。如果清理一次不管用多执行几次偶尔需要选择“Break locks”选项。4.4 查看日志和版本对比SVN的历史回溯能力其实很强。右键 - TortoiseSVN - 显示日志Show log能看到这个目录或文件的所有提交记录按提交人、时间、版本号排序。点击任意一条提交记录可以看到该版本改动了哪些文件。想对比两个版本的差异可以在日志窗口里选中版本列表右键 - 与前一版本比较Compare with previous revision会弹出差异对比对话框左右两栏分别是旧版本和新版本改动行高亮显示。团队代码评审、排查线上问题时这个功能比打开IDE慢慢翻代码高效得多。5. 冲突来了怎么办一个真实场景的完整处理SVN入门阶段最容易被吓住的操作就是冲突处理其实按流程走真的不难关键是要看懂冲突界面和选项。5.1 冲突是怎么发生的冲突的前提是两个人同时修改了同一个文件的同一块内容。场景还原小A从仓库检出代码第10行是color: red。小B也检出代码同样改了第10行改成了color: blue并且已经Commit。小A在没Update的情况下也把第10行改成了color: green提交时发现版本冲突。SVN能自动合并两个人对不同地方的修改但同一行内容同时改它就不知道听谁的只能把冲突标记出来让开发者手动处理。5.2 冲突处理界面和三种策略当更新或提交遇到冲突时SVN会在冲突文件旁生成几个临时文件文件图标变成黄色感叹号。右键这个冲突文件 - 编辑冲突Edit conflicts会打开一个三栏合并界面左边栏目是“Mine”即你的本地版本内容。右边栏目是“Theirs”即刚才拿到的最新版本内容。底部是“Merged”即最终要保留的结果区域。处理方式有三种看你实际情况选使用我的版本Use text from “Mine”直接保留你本地的改动对方的改动直接放弃。使用他们的版本Use text from “Theirs”放弃你的改动完全采用对方的内容。手动合并在左边或者右边选中需要的代码段右键选择“使用文本块”“使用整个文件”把内容拼到底部的Merged区域里。处理完Merged区域里内容正确之后记得在文件上右键 - 已解决Mark as resolved临时文件会被清除黄色感叹号消失文件恢复绿色选中状态。这一步很多人会漏掉如果不标记已解决文件会一直保持冲突状态后续提交和更新都会卡住。5.3 防止冲突的日常习惯冲突本身不可怕但频繁冲突会严重影响效率。我实际用下来下面这几条习惯能大幅降低冲突概率开工前先Update。这是最基础也是最重要的一条。涉及公共配置类文件时尽量不要多人同时改。比如package.json、pom.xml、application.yml这类文件一旦冲突手动合并的难度远高于普通代码。提交前再Update一次。养成“临门一脚”的习惯把可能冲突的问题消耗在更新阶段而不是提交阶段。大文件、二进制文件用锁Lock机制。比如一份策划的Excel表格右键 - 获取锁定Get Lock别人就无法打开编辑避免两个人同时改一个二进制文件导致彻底无法合并。6. IDEA集成配置SVN、检出项目、解决version not under control实际开发中大部分人不会直接用小乌龟敲命令而是用IDE集成的SVN插件。IDEA的SVN集成做得相当成熟但配置过程有几个易踩的坑。6.1 IDEA里配置SVN插件打开IDEA进入File - Settings - Version Control - Subversion。页面上会有一个“Use command line client”的选项你需要在输入框里填上svn.exe的完整路径。路径取决于TortoiseSVN安装时选择的目录以我机器为例C:\Program Files\TortoiseSVN\bin\svn.exe注意这个路径前端默认是空白的如果你用的是小乌龟安装时带上的command line工具就填这个路径。如果没有这个路径说明安装时漏掉了command line client tools要么补装要么重新安装TortoiseSVN。配置完成后IDEA右下角应该会出现一个小SVN图标或者在某些视图下能看到版本控制状态。还有一个容易遗漏的点是当你打开项目时IDEA需要识别出这个项目用的是哪种版本控制。如果项目是从SVN检出的但IDEA没有自动识别菜单栏的VCS会变成灰色。这时候可以到File - Settings - Version Control右侧列表里找到你的项目目录把版本控制下拉框改成Subversion然后点OK。6.2 把项目share进SVN和从SVN检出两种情况分别处理。如果项目已经写完了想把它提交到SVN仓库打开项目后菜单栏选择VCS - Import into Version Control - Share ProjectSubversion输入仓库URL选择目标目录一般选trunk确认文件列表后提交初始版本。如果是新接手的项目从SVN拉取代码选择VCS - Get from Version Control左侧选Subversion输入仓库URL和本地目录点Clone/Checkout即可。IDEA的SVN检出本质上也是调用svn checkout命令底层操作和小乌龟完全一样。6.3 重装系统后项目报version not under control怎么办这个问题你只要搜一搜就发现很大一堆人踩过。“version not under control”这个报错出现时机通常是重装系统、重装IDEA之后重新打开一个之前用SVN检出的项目。原因说穿了很简单项目目录下的.svn文件夹不存在或者IDEA没有把它识别为一个版本控制目录。重装系统之后如果你之前只是把源码文件拷了回来svn目录没拷那IDEA肯定认不出这是SVN项目自然报“not under control”。另外还有一种情况是项目还在但IDEA的版本控制设置被重置了需要手动指定。排查和处理路径我总结如下检查项目根目录下是否能看到.svn文件夹。看不到的话最简单暴力的解决方案是用TortoiseSVN重新检出一次项目到新目录然后把你自己本地的改动文件覆盖过去重新提交。这个方案最稳妥能彻底解决元数据缺失的问题。如果.svn存在但IDEA还是报错先到File - Settings - Version Control里确认项目目录的版本控制方式是不是Subversion如果不是手动改一下。然后到VCS - Enable Version Control Integration选择Subversion让IDEA强制启用版本控制集成。还不行的话VCS - Subversion - Add to VCS把根目录下的文件重新加入版本控制IDEA会重新识别这些文件与仓库的关联。最终手段File - Invalidate Caches / Restart清掉IDEA的本地缓存和索引重启后重新打开。这个操作有时能解决很多不明缘由的IDE状态异常。根据我的经验绝大多数“version not under control”都出在.svn目录缺失或IDEA缓存错乱这两个点上按上面顺序排查基本两个小时内能解决。7. 团队权限与控制从一人开发到多人协作SVN能在企业里活这么多年除了简单还有一个关键是权限管理非常直观。团队协作场景下SVN的权限盯得越清楚代码就越安全。7.1 svnserve.conf和authz权限设置SVN服务器端控制权限的核心是仓库conf目录下的三个文件svnserve.conf、passwd、authz。svnserve.conf控制总开关一个典型的配置长这样[general] anon-access none auth-access write password-db passwd authz-db authz这里的含义是匿名用户完全不能访问只有通过密码验证的用户才能写入账号密码存在passwd文件里目录权限规则存在authz文件里。passwd文件格式很简单[users] alice 123456 bob abc123 carol cba321authz文件控制用户/用户组能访问哪些目录、读还是写一个常用的配置示例[groups] dev alice, bob leader carol [/] leader rw dev rw * r [/admin] leader rw dev * 解释一下leader和dev组对根目录有读写权限其他人只读。但/admin目录只有leader组能读写dev组和其他人都没权限。这种按目录划分的权限控制机制非常直接适合按模块分隔团队的场景。7.2 分支、标签的正确用法SVN的分支和标签本质是目录拷贝。在TortoiseSVN里右键trunk目录 - TortoiseSVN - 分支/标记Branch/tag输入分支路径比如branches/feature-loginSVN就会在服务器端复制一份trunk的当前内容作为新分支。分支开发完成后需要把分支的改动合并回trunk。操作是先切换到trunk的工作副本右键 - TortoiseSVN - 合并Merge选择“合并一个版本范围”Merge a range of revisions选择来源分支路径和要合并的版本范围确认后执行。标签的创建方式和分支几乎一样但目的不同。标签是只读的不允许往tags目录提交改动。团队规范一般规定发布时从trunk打一个tag之后要修bug就在tag上开修复分支或者直接在trunk里改改完再打新tag。这样做的好处是每个版本的代码都能独立回溯发布记录一目了然。7.3 团队协作的几个实用规范权限配好之后SVN的日常管理还有几件小事值得立规矩禁止把大文件塞进仓库。比如超过200MB的二进制资源放SVN里只会拖慢所有人的checkout和update速度建议用专门的文件服务器或者网盘管理。提交前检查提交文件列表。TortoiseSVN提交界面的文件列表是可以逐个勾选的提交前扫一眼有没有误入的临时文件、调试日志、本地配置。临时调试代码用分支或注释标记不要随手提交到主干。如果只是本地验证就不要提交必须提交时提交信息里写明是“WIPWork In Progress”。养成打标签的习惯。每发布一个稳定版本就打个tag。上线出问题回滚时直接checkout对应tag的代码比在trunk历史里翻来翻去可靠得多。我在实际项目里见过不少人把SVN用成“网盘”天天更新从来不提交或者提交时文件列表里一堆编译产物。其实SVN的每个设计都是为了让人更清楚地管理代码变化你只要把流程走顺了它比你想的要好用得多。8. 最后分享一点实践经验SVN这套东西说起来不复杂但真正用顺需要一个过程。我自己的体会是最开始用的时候养成几个条件反射式的操作习惯会让体验好很多每天上班第一件事先Update提交之前再看一眼Update提交信息必须让同事能看懂遇到lock和cleanup问题先冷静。这四件事坚持一两周SVN在你手里就跟Windows资源管理器一样自然了。还有个小技巧如果你在IDEA里用SVN但提交信息总是写得敷衍可以试试提交时强制填写信息TortoiseSVN设置里有“需要一个信息”的选项把默认的“*”改成必填标记系统会直接拦住空日志的提交。这种小约束能让团队的提交历史干净不少。版本控制工具学到根上都是相通的SVN入门之后再去接触Git你会发现它们的核心思想高度一致区别只是实现方式和使用习惯。30分钟学会SVN主流程是合理的预期但真正成为肌肉记忆还是得靠在真实项目里跑几轮提交、合并和冲突处理。希望这篇教程能帮你少走点弯路把这套经典工具踏踏实实掌握下来。
返回列表