尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

TortoiseSVN实用指南:从检出到冲突处理,掌握SVN日常操作

TortoiseSVN实用指南:从检出到冲突处理,掌握SVN日常操作 SVN这名字放在今天确实有点“老派”了但你去问一圈不少公司的生产项目、外包交付、文档和测试协同依然在用SVN。而只要在Windows上工作tortoiseSVN基本就是接触SVN的第一道门。它到底能干什么、日常到底怎么用、为什么团队总在强调“先更新再提交”以及那个让人头大的冲突到底怎么处理这篇就按实际使用顺序把tortoiseSVN的基本功能拆开讲一遍。文章适合刚接触SVN的开发者、测试、产品、文档同学也适合被分配了SVN账号但一直没搞懂右键菜单里一堆选项的人。1. TortoiseSVN到底是什么先分清SVN和这个“小乌龟”1.1 版本控制里客户端和服务端各管什么很多人第一次用SVN会把概念搞混。修个bug、改个文档提交上去以为tortoiseSVN就是那个“存储代码的地方”其实不对。SVN本身是一个集中式版本控制系统它分为两部分服务端Subversion Server负责集中存储所有历史版本、目录结构、权限控制。文件都保存在仓库Repository里。客户端负责把你的工作目录和仓库保持同步提交本地修改、拉取远端更新、查看历史等。tortoiseSVN就是Windows下最主流的SVN客户端。tortoiseSVN没有自己独立的“云盘”或“服务器”它只是做了一个图形化壳把SVN的命令行操作封装成了右键菜单。你右键点“SVN Commit”本质上是帮你在当前目录执行svn commit命令。所以别指望装了个tortoiseSVN家里就能有代码仓库仓库还得靠VisualSVN Server、Linux Apache/Subversion这些服务端来搭。1.2 装完以后你的右键菜单多了什么tortoiseSVN装完后最直观的变化就是Windows文件夹右键菜单里多出了“SVN检出”Checkout、“TortoiseSVN”子菜单等一堆选项。打开“TortoiseSVN”子菜单还会看到“Update”、“Commit”、“Add”、“Delete”、“Rename”、“Branch/Tag”、“Switch”、“Merge”、“Repo-browser”等等。一个工作习惯是把这些功能按使用频率分成几组高频日常操作SVN Update、SVN Commit、Add、Delete、Rename。需要理解再用的操作Branch/Tag、Switch、Merge、Lock。排查和辅助功能Check for modifications、Repo-browser、Show Log、Cleanup。不常用但关键时刻很救命Export、Relocate、Diff external。这篇文章的后续部分就是按这条主线把第一组和第二组功能逐一过一遍第三组和第四组放到后面单独说清楚。2. 安装与初始配置从下载到第一次检出2.1 到底该下载哪个版本tortoiseSVN官网就是tortoisesvn.net下载页面很干净直接选对应Windows位数的最新版本即可。这里要注意三个细节早期tortoiseSVN只支持32位系统现在基本都以64位为主了。下载前先确认你的Windows是x64还是x86装错版本的话右键菜单可能会失效。安装包里有个“SVN command line tools”选项默认是不装的。如果后续需要写脚本、在终端里跑svn命令建议回头把这一项也勾上。语言包Language Pack和主程序是分开下载的建议一起下。先装主程序再装语言包然后去Settings里把语言切到“中文简体”。顺序不要反。我见过不少人先装语言包再装主程序结果语言包被覆盖界面还是英文还得再装一遍。2.2 装完后的初始化设置装好之后随便找一个目录右键点“TortoiseSVN” - “Settings”有几项值得在开工前调整语言Language如果装了语言包这里选“中文简体”。tortoiseSVN的汉化很完整菜单、提交对话框、冲突编辑器都能变成中文对新手友好很多。图标叠加Icon Overlays如果你的电脑上装了很多云盘工具、同步盘资源管理器里的绿色小勾可能显示不全。可以在这里把状态缓存Status Cache从“默认”改成“Shell”能缓解一部分图标丢失的问题。已保存数据Saved Data这里可以一键清空认证缓存、日志缓存。遇到“明明改过密码但总是报认证失败”的情况来这清一下缓存往往能解决。外部差异/合并工具Diff/Merge默认的TortoiseMerge已经够用但如果你习惯Beyond Compare、WinMerge可以在“Diff/Merge”选项卡里手动指定路径。这个设置后续比较代码会很爽。2.3 第一次检出版本库拿到仓库URL之后第一次使用流程是这样的在本机选一个合适的位置新建一个空文件夹比如D:\workspace\projectA。在该文件夹里右键选择“SVN检出”。在“版本库URL”一栏粘贴仓库地址比如https://svn.example.com/svn/projectA。检出深度默认“完全递归”正常项目都这么选。版本默认“HEAD版本”也就是最新版本没有特殊需求不用改。点“确定”等进度条跑完。完成后这个文件夹就成为了工作副本Working Copy。里面会多出一个隐藏的.svn文件夹所有本地状态、服务器地址、版本号信息都存在这个目录下。工作中不要手动去删.svn删了tortoiseSVN就分不清这个目录和仓库的对应关系了。实际操作里有一个坑检出时目标文件夹最好是空的。如果目标文件夹里已经有同名文件检出很容易报“目标路径已存在”之类的错误。就算侥幸检出成功也可能因为文件冲突导致后面操作乱成一团。3. 日常核心操作Update、Commit、Add这几个动作必须形成肌肉记忆3.1 为什么团队总在喊“先更新再提交”SVN是集中式版本控制意味着同一份代码大家共享。你本地改得再欢服务器上可能有别人已经提交过的新版本。如果不先更新直接把本地改动提交上去很容易造成“版本过期”的错误。正确的日常循环是开工前在项目目录右键 - “SVN Update”把队友提交的最新代码拉到本地。编码/改文档过程中该改就改tortoiseSVN会帮你识别哪些文件内容发生了变化。完成后右键 - “SVN Commit”勾选需要提交的文件填写日志提交。遇到别人也改了同一文件Update时tortoiseSVN会尝试自动合并合并不了的再手动解决冲突。更新操作本身很智能。它会把仓库里比你本地新的文件版本拉下来如果你在本地也修改过同一个文件tortoiseSVN会尝试合并修改。能自动合并的它会静默处理然后提示“完成。已更新到修订版XXX”。不能自动合并的文件会进入冲突状态这个放到第5章单独讲。3.2 提交信息写什么才有价值提交Commit是团队协作里最核心的动作但很多人处理得相当随意。在项目目录或单个文件上右键 - “SVN Commit”会弹出一个提交窗口。窗口上半部分是文件列表显示将会被提交的文件下半部分是日志信息输入框。提交时有几个经验值得养成提交前先“更新”。哪怕你只改了自己的文件更新一下能大大减少冲突概率。只勾选跟本次改动相关的文件。这个尤其重要别一次把一堆不在本次范围内的文件顺手提交上去后续追查问题会很痛苦。日志信息别写“修改bug”“更新文件”这种废话。最好能让人从日志里看懂“改了哪个模块、修了什么现象、影响范围是什么”。简单说日志是写给别人看的更是写给未来的自己看的。3.3 新文件进来要先“Add”一下吗这是新手最容易忽略的点。在项目里新建了一个文件右键 - “SVN Commit”发现文件列表里压根没有这个新文件或者这个文件显示成蓝色问号状态。很多人的第一反应是“是不是提交漏了”。不是漏了是你还没告诉SVN“这个文件要纳入版本控制”。仓库只会记录纳入了版本控制的文件。新建文件如果不做任何处理它在tortoiseSVN眼里就是“未版本控制”Unversioned状态提交时不会被带上去。正确做法是右键新文件 - “TortoiseSVN” - “添加”Add。此时文件状态会变成“已添加”图标上有个蓝色加号。再次执行“SVN Commit”才会把这个文件真正提交到仓库。那如果有些文件不想进版本库怎么办比如IDE的配置文件、日志文件、临时文件右键 - “TortoiseSVN” - “添加到忽略列表”就可以。忽略规则支持按文件名、扩展名通配、目录等不同粒度去配团队协作时建议统一在设置里维护一套全局忽略模式。3.4 删除、重命名别直接用Windows资源管理器版本控制系统的核心是记录历史。你用Windows右键直接删掉一个受控文件SVN会把这个变化理解为“这个文件缺失了”但它不知道你是故意删除的状态会变得不太干净。重命名和移动文件同理如果直接在资源管理器里操作SVN会认为旧文件被删了、新文件出现了而不是“文件重命名”。正确操作是文件上右键 - “TortoiseSVN” - “删除”或“重命名”。tortoiseSVN会先记录这个变更意图等到提交时再把“删除”“重命名”的操作同步到仓库。如果你已经用Windows资源管理器改了文件名也不要慌。在tortoiseSVN里可以选中旧文件名它还在右键 - “TortoiseSVN” - “重命名”输入新文件名如果系统检测到本地有这个文件会把它绑定成重命名操作。能救但要绕一圈。4. 分支、标签与合并项目多版本并行不乱套的关键4.1 trunk、branches、tags到底是什么很多刚从Git转过来的同学看SVN仓库会被标准的目录结构吓到trunk、branches、tags三个目录是干嘛的。trunk主干也就是主开发线。团队日常开发的核心代码都在这。branches分支为某个独立需求、某个发版周期拉出的平行开发线。分支改完可以合并回主干。tags标签某个发布版本的快照只读不做日常开发。用于标记“v1.0”“v2.1”这些历史里程碑。这种结构是SVN社区约定俗成的规范服务端没有强制要求但绝大多数团队都按这个来。好处是版本管理层面代码路径就是逻辑结构看路径就能知道项目处于什么阶段。4.2 在tortoiseSVN里创建分支创建分支的操作极其简单右键目标目录 - “TortoiseSVN” - “分支/标记”Branch/Tag在弹出的窗口里填上目标路径比如需要把trunk复制到branches/release-2.0就在“至路径”里填分支的完整URL。本质上分支操作就是在仓库里做一次“远程复制”把trunk当前的内容复制到新路径下。SVN的内部实现是“便宜拷贝”cheap copy不会真把文件全部拷一遍所以即使仓库很大创建分支也很快。创建分支后工作副本不会自动切换。你还需要在本地项目目录右键选择“TortoiseSVN” - “切换”Switch把工作副本指向新分支路径。这时候再执行Update、Commit就是针对分支操作了。4.3 合并分支时头脑里要有“差异”意识分支长期存在而不合并等于白开分支。合并的本质是把一个路径下的修改差异应用到你当前的工作副本里。tortoiseSVN的合并入口在右键 - “TortoiseSVN” - “合并”Merge。弹出的窗口有四种合并类型日常最常用的是合并一个版本范围Merge a range of revisions适合把trunk上的某些提交同步到分支或者把分支的某些提交同步回trunk。重新整合一个分支Reintegrate a branch适合把一个分支的整个生命周期成果合并回主干操作前需要把分支先更新到trunk的最新状态。合并完成后本地的文件会带上别人的修改你需要重新查看差异、跑测试、解决冲突然后提交到当前工作副本对应的路径。我见到不少团队为了省事长期把trunk“锁死”只让主干成员修改其他人全部在分支上开发等上线前一次合并回trunk。这个模式本身没毛病但执行的时候一定要控制好分支存活的周期。分支开得越久、离trunk越远合并时的冲突就越猛烈。建议多分支并行时至少每周把trunk往分支上合并一次保持分支的代码新鲜度这样最后整合的冲突面会小很多。5. 冲突处理这个功能决定了SVN好不好用5.1 冲突是怎么来的能避免吗先回答一个很多新手都会问的问题为什么大家一起用SVN还会出现冲突假设你和同事同时修改了同一个文件你改了第10行他改了第20行这是没问题的。SVN这个工具会在Update时自动完成行级合并把两处修改都保留。冲突只发生在一种情况下两个人改了同一个文件的同一个位置而SVN不知道到底该保留谁的版本于是把决定权交给你。冲突并不是SVN的缺陷它恰恰是版本控制工具负责任的体现。它没敢擅自替你选而是把矛盾摆到明面上来。5.2 冲突以后编辑器里三栏怎么看当Update或者合并出现冲突时文件图标会变成黄色感叹号文件名后面跟着“conflicted”。查看冲突文件目录你会看到多出几个临时文件file.mine你本地的修改版本。file.rOLD你当前工作副本修改之前对应的版本。file.rNEW服务器上包含别人提交的新版本。file整个文件里面被加入了冲突标记、、。右键冲突文件 - “TortoiseSVN” - “编辑冲突”Edit Conflicts会打开TortoiseMerge。界面按三个面板展示左边的“我的”mine本地版本。右边的“他们的”theirs服务器版本。下方的“合并的”merged最终要保留的合并结果。解决冲突的操作并不复杂核心就是逐条看冲突标记决定最终内容保留我的、保留他们的、两个都留、还是手动改。处理完保存回到资源管理器文件右键 - “TortoiseSVN” - “已解决”Resolved让SVN把临时文件清理掉随后提交。这里有个关键点要提醒出现冲突时先冷静一个一个看不要图省事一键选择“全部用他们的”。关掉编辑器直接提交也不是正确流程因为此时文件里的冲突标记还在SVN会拒绝提交或者提交进去会让整个文件没法正常编译。务必先解决再标记“已解决”最后提交。5.3 那个“skipped, remains conflicted”是怎么回事不少人在多文件同时冲突时遇到过一行提示Skipped xxx.java -- remains conflicted翻译成大白话tortoiseSVN在Update时跳过了这个文件因为它还处于冲突未解决状态。这个机制很合理。一个文件已经处于冲突状态如果SVN又把你本地的修改强行覆盖成服务器版本那之前冲突里你手工保留的内容就会彻底丢失。所以SVN干脆先跳过等你去“已解决”再重新Update。处理步骤是先去处理冲突文件标记“已解决”。在项目根目录右键再次“SVN Update”。如果之前因为跳过导致某些文件没更新到最新这次就会被正常拉下来。记住出现这个提示不要慌它代表“有冲突文件挡住了更新进度”不是代码坏了。6. 这些辅助功能不一定天天用但关键时候能救命6.1 版本库浏览器不检出也能看仓库右键任意目录 - “TortoiseSVN” - “版本库浏览器”Repo-browser会打开一个类似文件管理器的窗口。这里看到的是远程仓库的真实目录结构。这个功能的使用场景很典型接手一个老项目先不开IDE也不检出全部代码直接浏览器看一圈找找有没有README、有没有release目录、配置文件放在哪。也可以在浏览器里直接创建目录、导入文件、查看历史省去下载整个仓库的等待时间。对于动辄几个G的项目非常实用。版本库浏览器里还能顺便看到每条路径的提交日志、作者和版本号放在项目梳理、交接时极有价值。6.2 Show Log与Blame把历史翻出来看右键文件 - “TortoiseSVN” - “显示日志”Show Log能看到这个文件的所有历史提交记录。日志窗口支持按日期范围、作者、注释内容过滤双击某一条提交还能看到这次改动了哪些具体内容。“追溯”Blame则更狠一点。右键文件 - “TortoiseSVN” - “追溯”它会显示文件的每一行代码分别是哪个版本、哪个作者、哪一天改的。排查线上问题的时候Blame几乎是必用功能——哪一行出了问题直接定位到改动它的人和时间点效率非常高。版本对比Diff也一样实用右键文件 - “TortoiseSVN” - “与Base版本比较”可以在不打开IDE的情况下快速查看这个文件相对于上次提交做了哪些改动。提交之前养成看一眼Diff的习惯能拦掉非常多的低级错误。6.3 锁、导出和清理几个容易忽略的细节SVN支持一个“锁”Lock功能。右键文件 - “TortoiseSVN” - “获取锁定”Get Lock可以把某个文件锁住锁住期间其他同事只能读不能改提交会被服务器拒绝。这个功能对二进制文件特别适用比如设计稿、安装包、配置文件这类没法自动合并的资源。注意锁不是拿来耍官威的锁完记得及时释放不然就会成为团队协作的绊脚石。“导出”Export则是把工作副本里的文件导出一份不带.svn目录的纯文件目录适合做交付物、给甲方打包、或者复制一份干净代码去做对比实验。注意导出的目录没有版本控制能力不能再执行Update和Commit。还有一个“清理”Cleanup功能永远会在你慌张的时候出现。上次操作中途关机、网络断连、进程被杀都会导致工作副本残留一个“锁”下次执行任何操作都报“Working copy locked”或“run svn cleanup”。这时候右键根目录点“TortoiseSVN” - “清理”把残留的临时状态清掉就好。就和电脑死机重启一样Cleanup是第一急救手段。6.4 仓库地址变了不用重新检出公司服务器迁移了、域名换了仓库URL变了你是不是准备重新检出一遍不用。在项目根目录右键 - “TortoiseSVN” - “重新定位”Relocate在弹出的窗口里把旧的URL根地址改成新的就可以。这个操作只修改工作副本里记录的服务器地址不改变本地文件内容和历史比重新检出省事太多了。不过要注意Relocate只适用于仓库结构没变、只是服务器地址变了的情况。如果仓库目录结构都改过还是要谨慎处理建议找管理员确认。7. 常见问题与排查把我踩过的坑都提前填上7.1 图标不显示一大半人都栽在这右键菜单还在但文件夹上该出现的绿色小勾没有了。这几乎是tortoiseSVN最经典的疑难杂症。原因通常是Windows资源管理器对图标叠加Icon Overlay的数量有限制而OneDrive、坚果云、Dropbox这类同步工具也在抢这部分名额tortoiseSVN的叠加图标被系统挤掉了。排查顺序打开资源管理器 - 查看 - 选项确保“显示隐藏文件”和“隐藏受保护的操作系统文件”两项正确。右键 - “TortoiseSVN” - “Settings” - “图标叠加”Icon Overlays。把“状态缓存”改成“Shell”重启资源管理器。如果还是不显示再检查是否被某些“磁盘清理”工具误删了注册表项。简单说图标不显示不影响任何功能单纯是视觉层面的问题。要是实在显不出来不用太纠结。7.2 “out of date”提交不过去提交时提示“item is out of date”意思是本地版本落后于仓库SVN不允许直接提交。正确解法是先Update把仓库的新版本拉下来再处理可能出现的冲突最后重新提交。这个过程里不要耍小聪明通过删掉重新检出绕过否则自己本地改的东西可能全丢。7.3 文件明明改了状态却不更新部分文件改了内容但图标始终显示没变。不要立刻怀疑tortoiseSVN坏了先看几个点是不是文件被“忽略”了检查右键 - “TortoiseSVN” - “添加”是否可用。是不是设置了“只读”属性。是不是TD某种换行符问题导致的视觉差异。还可以通过右键 - “TortoiseSVN” - “检查修改”Check for modifications来查看工作副本中被修改、缺失、未版本控制的所有文件这个视图比资源管理器图标直观得多。7.4 常见错误速查表现象常见原因解决方式右键菜单没有SVN选项安装未完成或位数不匹配重装对应版本重启电脑提交失败报out of date本地版本落后先Update处理冲突再提交报working copy locked上次操作异常中断项目根目录执行CleanupUpdate时skipped, remains conflicted冲突未解决冲突文件处理完标记已解决再Update认证一直失败账号密码变了设置里清空已保存的数据重新认证某文件提交不上去未纳入版本控制先Add再Commit7.5 和IDE配合的小经验不少开发者在IDEA、Visual Studio里通过插件直接操作SVN。这种情况下插件底层依然可以调用tortoiseSVN但两者最好别混用。建议是日常提交、更新、看Diff用IDE插件遇到冲突、分支合并、仓库URL变动这类复杂操作切回tortoiseSVN操作图形化窗口更直观不容易出错。结语几个我用了多年才想明白的建议最后按老规矩分享一点个人体会。tortoiseSVN这种全右键操作的模式初次用会觉得功能又多又杂但只要把“检出-更新-提交-添加”这四个操作练熟日常工作基本就能覆盖80%了。剩下的功能需要时再去点开看一眼右键菜单本身就是最好的帮助文档。给新手两个建议第一养成提交前“先Diff再Commit”的习惯很多误改、调试残留代码都是这一步拦下来的第二提交日志尽量做到“别人不看代码也能知道这次改动的目的”这个习惯会让你在团队里的靠谱程度直接上升一个台阶。SVN不新但它把版本管理的基本逻辑做得非常稳定、清晰。掌握好它以后再接触Git这类分布式版本控制理解起来也会轻松很多。
返回列表