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