svn版本控制心得
2016-02-14 00:03
176 查看
写在前面
本文是由演讲整理而来的,介绍了 SVN 分支与合并的概念、流程和一些实际操作方法,适合对版本控制有基本认识然后想了解 SVN 分支与合并的使用方法的读者。对应 SVN 版本最低为 1.5,因为分支、合并的很多功能都是 1.5(release notes ) 才加进来的。
一些相关的概念和原理
分支(branch)和标记(tag)对于 SVN 来说就只是副本(copy),没有任何其它意义。分支和标记的意义是我们人为给予的。SVN 的副本是通过"cheap copies "来实现的,建立一个副本就类似
Unix 中创建一个硬链接(hard link),空间和时间的消耗都是固定并且很小的,因此不必太过担心副本太多而导致性能问题。
SVN 的文件储存 是通过差异(diff)来实现的,底层储存方法有两种:1、Berkeley
DB,完整保存一个文件的最新版本(revision),旧版本通过反向差异(reverse diffs)来获取。2、FSFS,跟 BDB 相反,完整保存一个文件的初始版本,后续版本通过正向差异来获取。当然,为了避免版本太多而造成性能下降,SVN 还使用了"skip-deltas "来减少需要追溯的版本数。
SVN 属性(property )可以附带在文件、目录和版本(revision)上。文件和目录的属性类似文件内容,会被记录进版本库中的,例如每次提交时的注释,其实就是该版本的一个属性
svn:log。以"svn:"开头的属性是系统预留的,用户不应该自定义这样的属性。
进行分支开发的最佳实践
做分支上做开发的时候,必须定期使分支与主干同步,避免开发完成后合并(merge)回主干时出现严重冲突(confict)。进行合并前,处理掉工作副本上的所有本地修改,方便合并失败时进行回滚(revert)。
进行合并时,特别注意 新增/删除 操作,因为很多冲突都是这类操作引起的。
完成一个分支的功能并合并回主干后,抛弃该分支,后续其它功能的开发使用新建的分支。当然,也有办法继续使用该分支。
合并的分类
1、从主干到分支
![](http://dl.iteye.com/upload/picture/pic/71404/f4e61ecd-6efa-35dc-8e51-329d249da721.png)
Svn代码
![](http://renial.iteye.com/images/icon_star.png)
svn merge [-r M:N] ^/trunk
假设"^/trunk"是主干的 URL,当前目录为分支的工作副本。该命令同步主干的最新修改到当前工作副本,用于使分支跟主干保持同步。SVN 会通过 svn:mergeinfo 属性来记录当前工作副本已经合并过的版本号,然后在每次合并时选择合适的(eligible)版本进行合并。当然,也可以自己手动指定合并版本M到N的修改。
2、从分支到主干
![](http://renial.iteye.com/upload/picture/pic/71402/d0034702-c2cb-3533-98b6-20192bf76eae.png)
Svn代码
![](http://renial.iteye.com/images/icon_star.png)
svn merge --reintegrate ^/branches/quota
假设"^/branches/quota"是分支的 URL,当前目录为主干的工作副本。该命令将分支的最新版本(@HEAD)跟主干的最新版本进行比较,将差异实施到当前工作副本,用于将在分支上完成的工作合并回主干。
分支使用 --reintegrate 合并回主干后,如果继续在该分支上开发,当需要同步主干的修改到分支过来时,默认会包括之前 reintegrate 的修改,而这些修改已经在分支上做过了,所以这样往往会导致冲突。这也是前面“最佳实践”中最后一个建议的一个原因。当然,想要使这个分支继续可用也是可以的,这就需要使用下面这第三种合并。
3、仅记录的合并
![](http://renial.iteye.com/upload/picture/pic/71400/1270ab62-8cc1-35e5-995a-c90f9ed681f1.png)
Svn代码
![](http://renial.iteye.com/images/icon_star.png)
svn merge -c 25 --record-only ^/trunk
假设当前目录为分支的工作副本,该命令将主干的版本25标记为已合并到当前工作副本,但并不会进行实质性的合并,这样下次合并主干到分支时,该版本的修改就会被跳过,避免修改被重复实施导致的冲突。其实这种合并就是改一下 svn:mergeinfo 而已,但直接修改太危险了,所以弄了这样一个所谓合并来规范操作。
在 Eclipse 中进行合并操作
Subclipse
在 Eclipse 中有两个比较流行的 SVN 插件:Subclipse 和 Subversive,关于两者的讨论有很多,例如这里 。本文只介绍 Subclipse。![](http://renial.iteye.com/upload/picture/pic/71398/df681566-22f5-3a33-80b2-12692eda6797.png)
上图是 Subclipse 进行合并操作时的界面,该图所对应的操作是:将 trunk 上版本 8 至今的修改同步到工作副本 pearbranch,也就是分支 branches/quake。这里可以发现几个问题:
不能进行自动合并,必须手工指定版本号。
不能进行仅记录的合并
不能直接进行 --reintegrate 的合并
CollabNet Merge Client
上述 Subclipse 的不足,应该是因为 Subclipse 默认的合并实现是基于 SVN 1.4 之前的,那时还没有 svn:mergeinfo、--reintegrate 和 --record-only 呢。要支持这些 1.5 的新特性,可以安装 CollabNet Merge Client。![](http://renial.iteye.com/upload/picture/pic/71406/e7cb4488-ed32-3fed-88e1-87095194c342.png)
CollabNet Merge Client 是 Subclipse 的一个可选功能,其实就是一个增强的、支持新特性的合并实现,如上图所示,它的优点有:
支持合并信息自动跟踪和自动合并
支持 --reintegrate 和 --record-only
合并前能对工作副本进行检查
转载自http://renial.iteye.com/blog/761183
相关文章推荐
- About SVN
- CentOS 6.5搭建Apache整合SVN 1.8.5服务器(多版本库权限配置)
- CentOS下SVN服务器测试版安装记录
- 如何在本机搭建SVN服务器
- Windows下搭建本地SVN服务器
- 简单谈谈node.js 版本控制 nvm和 n
- 让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
- Windows下SVN服务器搭建方法整理(apache)
- Apache2+SVN+MYSQL认证 配置项详细步骤
- VSS 软件配置管理 版本控制第1/2页
- 在Fedora 10下配置SVN服务器的步骤
- 删除SVN三种方法delSvn(windows+linux)
- 探讨如何在Eclipse中过滤版本控制文件.svn
- linux下安装配置svn独立服务器的步骤分享
- 浅析SVN常见问题及解决方法
- 关于svn冲突的解决方法
- 基于Eclipse中SVN图标不显示的解决方法
- Shell脚本实现的基于SVN的代码提交量统计工具