SVN使用培训2009-12主要内容第一章:SVN属性介绍第二章:SVN常用基本操作第三章:常见问题解决方法第一章:SVN属性介绍拷贝-修改-合并的文件共享方式全局修订号事务处理版本化的目录管理目录级权限管理高效的分支与标签操作Subversion版本控制系统使用拷贝-修改-合并模型,在这种模型里,每一个客户联系项目版本库建立一个个人工作拷贝—版本库中文件和目录的本地映射。用户并行工作,修改各自的工作拷贝,最终,各个私有的拷贝合并在一起,成为最终的版本,这种系统通常可以辅助合并操作,但是最终要靠人工去确定正误。文件共享方式-拷贝-修改-合并方案(SVN)这是一个例子,Harry和Sally为同一个项目各自建立了一个工作拷贝,工作是并行的,修改了同一个文件A,Sally首先保存修改到版本库,当Harry想去提交修改的时候,版本库提示文件A已经过期,换句话说,A在他上次更新之后已经更改了,所以当他通过客户端请求合并版本库和他的工作拷贝之后,碰巧Sally的修改和他的不冲突,所以一旦他把所有的修改集成到一起,他可以将工作拷贝保存到版本库,.拷贝-修改-合并方案展示了这一过程。文件共享方式-拷贝-修改-合并方案(SVN)文件共享方式-拷贝-修改-合并方案(SVN)缺点:当冲突发生后,需要手工解决冲突。文件共享方式-锁定-修改-解锁方案(VSS)缺点:锁定可能导致管理问题。锁定可能导致不必要的线性化开发。锁定可能导致错误的安全状态。全局修订号CVS和VSS的修订版本号针对单个文件。SVN的修订版本号是针对整个项目的(即整个配置库)。每一个修订号代表了该项目的一个快照。事务处理当读取或写配置库时,进行原子事务处理。举例如:一次提交多个文件,只要其中有一个没有提交成功,则该操作失败,其他文件也不会被提交。版本化的目录管理与CVS不同。SVN可以跟踪目录树的变更,把文件和目录的重命名及移动纳入版本控制公司的SVN库的目录基本结构|—Trunk主版本项目A—|—Branches分支版本(独立版本)|—Tags标记版本,比如发行版v1.0/v2.0等等目录级权限管理与CVS不同:CVS实现模块级权限管理,SVN可以实现目录级的方便的权限管理。高效的分支与标签操作在SVN中,分支与标签操作的开销与工程的大小无关。SVN的分支和标签操作是一种类似于建立链接。因而执行操作时所需的时间很少。第二章:SVN常用基本操作TortoiseSVN(SVN客户端)的安装方法从配置库检出工作拷贝到本地提交本地的修改内容到版本库获取别人的修改更新你的工作复本图标状态信息查看版本日志记录分支/标签操作合并操作客户端设置选项其他TortoiseSVN(SVN客户端)的安装执行如下可执行安装程序即可:TortoiseSVN-1.6.6.17493-win32-svn-1.6.6.msiTortoiseSVN是Subversion的Windows扩展。它使你避免接触Subversion枯燥而且不方便的命令行。它完全嵌入WindowsExplorer,打开资源管理器,点击一下鼠标右键,会看到类似如下的图,说明安装成功。从配置库检出工作拷贝到本地目的:创建工作拷贝并建立本地目录和配置库服务器的关联关系步骤:新建一空目录,如:testsvn;右键svn菜单执行“SVNCheckout”,然后在弹出对话框中输入项目的URL路径注意:只能导出赋予该用户读权限的目录提交本地的内容到版本库——增加文件在testsvn目录下新建一个项目文件testadd.cpp提交到版本库的方法方法一:先提交到变更列表中,再commit到配置库。选择该新增文件,右键svn菜单执行“Add”操作提交到“变更列表”中,然后右键svn菜单执行“SVNCommit”提交到版本库方法二:不提交到变更列表中,而是直接commit到配置库。选择该新增文件的父目录,右键svn菜单执行”SVNCommit”操作,在弹出的“变更列表中”选择新增的文件提交本地的内容到版本库——修改文件修改一个已入版本库的项目文件,修改后该文件图标显示一个感叹号提交到版本库的方法:方法一:文件提交方式。选择被修改文件,右键svn菜单执行”SVNCommit”。方法二:目录提交方式。选择被修改文件的父目录,右键svn菜单执行”SVNCommit”,在弹出的“变更列表中”选择修改的文件提交本地的内容到版本库——删除文件如果被删除的文件还未入版本库,则可以直接使用操作系统的删除操作删除该文件如果被删除的文件已入版本库,则删除方法如下:方法一:选择被删除文件,右键svn菜单执行“delete”操作,然后选择被删除文件的父目录,右键svn菜单执行”SVNCommit”方法二:使用操作系统的删除操作删除该文件,然后选择被删除文件的父目录,右键svn菜单执行”SVNCommit”,在“变更列表”中选择被删除的文件。获取别人的修改更新你的工作复本操作方法:获取版本库中的最新的内容:右键svn菜单执行“SVNUpdate”获取指定版本的内容:右键svn菜单执行“Updatetorevision”图标状态信息七种图标:表示版本控制状态正常表示本地工作复本已经被修改过,等待被提交表示出现了文件内容冲突表示该文件被他人锁定表示该文件被自己锁定表示当前文件夹下的某些文件已经被计划从版本控制中删除,或是该文件夹下某个受控的文件丢失了。加号表示有文件或目录已经加入“变更列表”中。查看版本日志记录查看的内容:可以查看被选对象的每个版本提交日志,包括提交人,提交时间,版本号,提交时的注释,以及提交的内容。如新增/修改/删除了哪些文件。在日志查看窗口为什么有时看不到连续版本号?Svn的缺陷?为什么是合理的?跟选择对象有关跟权限有关分支/标签操作分支的目的为客户开发订制功能而分支当需要为某客户在当前主线上定制一些功能时,必须进行分支,在分支上进行订制开发。该情况必须进行分支修改内容需要跨越一个发布点而分支当某修改内容需要等到当前主线发布后才考虑在下一次的发布中包含该修改内容时,必须先创建一个分支,在分支上进行修改和调试,待主线发布后,再把修改的内容合并到主线。该情况必须进行分支进行一些影响比较大的新特性开发或进行较大范围的代码重构时而分支为了尽可能保持主线的稳定性和减少对其他开发人的影响,当有一些比较大的修改时,则应进行分支,在分支上进行修改和调试,待分支调试稳定后再合并到主线。当主线已经趋于稳定且对其他开发人员会造成严重影响时,必须进行分支,否则可以不必进行分支。提供临时升级包而分支对于已经发布的项目,当主线处于持续的需求开发中时,这时如果需要为某客户提供一个非正式发布的不包含正在开发的内容的临时升级包时,为了避免正在开发的内容对其产生影响,必须从一个稳定的版本号开始建立一个分支,在分支上进行修改,待临时包提供后再考虑是否需要合并到主线上。该情况必须进行分支为了隔离已发布版本的维护与主线的开发对于已经发布的项目,日常开发工作则在主线上进行,当需要修复bug时先创建分支,在该分支上进行已发布版本的Bug修复,最后再合并回主线。如果主线上没有新的开发内容,则不需要进行分支。如果主线上继续有新需求开发,则必须进行分支测试阶段和后续新版本的开发当一个项目处在各种测试阶段时,如果这时同时又需要进行一些新特性的后续版本开发,则需要创建分支,开发人员可以不受影响地在主线上进行新特性的开发,测试Bug的排除则在该分支上进行,最后合并到主线上。该情况必须进行分支注意:分支/标签的源和目的都是在服务器上合并操作合并的目的:由分支的原因决定合并的方向:从主线合并到分支从分支合并到主线从分支合并到分支注意事项:合并的结果只能存放在本地,验证正确后才提交到服务器客户端设置选项常用的设置选项有:设置全局忽略模式设置语言设置自动检查最新版本并提示设置驱动器类型设置第三方比较工具和合并工具清除保存在本地的登陆认证账号其他加锁和解锁设置只读改名切换版本库浏览版本变化图属性设置清理第三章:常见问题实战解决怎样进行复原处理?怎样在提交时的文件列表窗口中过滤不想提交的文件?怎样控制开发人员在提交时必须添加备注信息?Samba共享方式下不显示状态图标怎么办?怎样同时查看一个文件的多个版本的内容?怎样查看两个版本的文档级差异并导出怎样引用公共模块?(即项目引用)怎样得到一份干净的项目代码?怎样避免冲突产生怎么解决冲突怎样进行复原操作?复原分类已提交到版本库中已入“变更列表”,但未入库怎样进行复原操作?已提交到版本库中操作方法:通过日志查看窗口-右键菜单中的复原菜单下面三个选项的区别?Updateitemtorevision(更新项目至版)Revertchangefromthisrevision(复原自此版本以来的变更)翻译不准确:应该是“还原此版本的变更”Reverttothisrevision(复原到此版本)区别:复原至此版本:只能选择一个版本,意思是将会还原从那个版本以来的所有变更,使用选中的版本来替换文件/文件夹。在实际使用中发现并不是简单的替换,如果你在当前工作复本中所做的修改不涉及到被选中版本以来的变更内容,那么你的修改会与选择的版本N进行合并,否则这个操作会产生一个冲突。复原自此版本以来的所有变更:可以选择多个,但必须连续,意思是将你选中的那些版本中的修改还原,而在那之后的版本中的修改,包括你在工作复本中的新改动依然会被保留更新至此版本:当前工作复本的版本被还原到你选中的版本。与“复原至此版本”的区别在于前者会改变工作复本的版本号,而后者“复原至此版本”不会改变当前工作复本的版本号这三个操作都只影响工作复本,并不对版本库造成影响。怎样进行复原操作?已入“变更列表”,但未入库方法:通过“revert”操作方法实现注意事项:新增,修改,删除可以完全还原到前一操作状态更名时,还原会不彻底选择对象关系过滤设置目录级过滤设置全局模式过滤设置格式要求:*/bin*/obj*.bak*.~??*.jar*.[Tt]mp怎样在变更列表窗口中过滤不想提交的文件?怎样控制开发人员在提交时必须添加备注信息?实现方法通过修改服务器脚本进行限制通过修改目录属性进行设置Samba共享方式下不显示状态图标怎么办?实现方法:通过设置svn属性可以解决怎样同时查看一个文件的多个版本的内容?版本追溯选择对象只能是文件怎样查看两个版本之间的文件级差异并导出?应用目的制作升级包操作方法通过“显示日志”窗口来导出通过版本分支图来导出注意事项明确导出对象范围版本比较的先后顺序与导出的内容有关怎样引用公共模块?(即项目引用)引用的目的代码共享。操作方法命令格式:so[-r9]引用的规范要求根据配置管理规范,只能引用tag区,不能引用主线区引用后创建的目录名要同被引用目录名相同注意事项URL发生改变会自动执行删除本地文件操作,然后再取出新的URL位置的文件一个人设置后,其他人不用再设只能进行目录级引用,不能进行文件级引用怎样得到一份干净的项目代码?应用目的:发布新产品操作方法export功能Export与checkout的区别?怎样避免冲突产生冲突出现的根本原因:本地的版本号与版本库中的最新版本号不一致。修改版本库中非当前版本的内容两个开发人员修改了同一版本号的同一文件的同一行。对于每个冲突发生时,在本地目录下会存在三个文件,如果这三个文件存在,就不允许提交到版本库。filename.ext.minefilename.ext.rOLDREVfilename.ext.rNEWREV避免和减少冲突的方法:修改前先从库中更新修改后及时提