<转>代码版本管理之SVN、Fisheye及其他

原链接:http://eyejava.iteye.com/blog/215899
http://hi.baidu.com/zeorliu/item/a7b5e1c0c23eda52ac00ef7e


使用 FishEye 直观了解 CVS 情况
转帖:http://www.cnblogs.com/flier/archive/2004/10/27/57511.html
原文:http://www.blogcn.com/User8/flier_lu/blog/4471578.html
虽然也有类似 CVSweb、ViewCVS 和 CvsGraph 等 Web 浏览工具的支持,但其功能定位只是在处理简单的文件浏览与比较,并不能完全解决复杂环境下的问题。相比之下大名鼎鼎的 Java 代码覆盖工具 Clover 提供商 www.cenqua.com 发布的 fisheye 较好地解决了这个问题。通过强大的代码分析和统计功能,以及灵活的搜索与比较,能够让使用者实时了解项目的整体进展情况。

1.为什么是SVN,而不是CVS?
cvs有几个大缺点:
1) tag记录在单个文件上,做版本发布的时候必须对整个项目的文件全部打上tag,操作十分不便。
2)cvs的版本管理是针对单个文件的,而不是针对整个项目,所以对cvs来说只有文件的版本而很难实现项目的版本
3)cvs陈旧的技术架构严重拖累了它,已经好多年没有进步了
而svn正好解决了以上的缺点,同时还带来更多的改进:
1).性能的提高。将更多的数据和操作放在本地,这样性能大大提高。svn协议在传输数据方面性能也是相当不错的,提交一个28M的二进制文件在局域网可以达到800Kb/s的速率,而且svn处理大文件根本感觉不到down机的现象,cvs在处理大文件就有很大的问题,在eclipse里面使用经常发生commit不一致的情况,这也是没有原子提交的问题
2).据说对二进制的文件也能当作文本文件一样来处理,版本只存储变化的部分,这样可以大大节约空间,提高效率
3).目录的版本控制。svn针对目录的移动、改名、删除都当作是版本的变化
4).原子性提交。是一个很好的改进,如果mysql有了事务处理,没有事务处理能叫数据库吗?当然,逻辑性的原子性提交svn是无法帮你完成的,一个开发人员修改了10个文件,做集成测试通过后准备提交代码,但是他一次只提交了8个文件,即使这8个文件成功提交,其他开发人员update到最新版本后也可能导致编译不通过或者运行不成功。所以:开发人员养成原子提交的习惯才真正有效,即要么10个修改过的文件一并提交,要么一个也不提交。当然svn也可以加上一个限制,提交必须整个项目提交,不过这样会带来更大的麻烦,比如临时修改的代码也提交了,完全不能自己控制提交某些代码。
5).原数据管理。目录和文件下的svn:property 也当作是版本的一部分,这是svn新的概念。
6).支持http,https协议,对于远程协作更为方便有效。不过据说https和svn+ssh效率不行。
7).svn是个新东西,所以相应的客户端也是新架构,所以tortoise-svn做的比tortoisecvs好多了,subclipse也不差,良好的客户端是方便使用的保障。
8)offline模式也可以提供很多功能,比如查看历史等等,如图:

需要说明一下,svn一般使用tags目录来做版本发布,branches下面存放分支,trunk是代码变更的主干。tag和branch都是通过copy revision的方式来进行,效率很高!而且操作很简单。

当然svn也有一些缺点:
1).不能回退误提交的版本,提交一次就将永远成为版本的一部分。
2).有待发现

2.安装使用svn
windows下下载安装包,默认安装即可。安装成windows服务会方便使用,项目组使用选择svn服务即可了,所以apache也没必要安装。
使用svnadmin create初始化repository。
svn import导入版本库
具体可参照svnbook里面的《快速指南》
注:subclipse不能设置语言选项,默认读取eclipse的语言环境,所以一般是中文菜单,需要改成英文菜单得修改eclipse.ini,加上:
nl
en_US

在初始化repository和初始化导入版本库时有两点很重要:
1.项目的目录结构。
有三种目录结构可供选择
1)在svnadmin create的时候将不同项目建成不同的目录,即/project1,/project2。这样每个项目的独立的,用户权限都是独立的。事实上做这些配置也是很少的工作,copy文件修改一下就可以了。但是项目组新加一个成员必须修改好几个project的配置
2)svn/project/trunk/..., svn/project/branches/NAME/..., svn/project/tags/NAME/...
3)svn/trunk/project/.., svn/tags/project/.. ,svn/branches/project/..
2)3)两种目录结构使用的是一个repository,所以配置相同。一个repository中的revision是从1累加的,所以区分到单个project中revision将不再是连续的。1)中目录结构可以保证revision数量连续。
2.初始化导入版本的时候千万不要把不需要纳入版本管理的文件和目录导入到repository中,因为svn是不能回退的,这些东西将成为版本垃圾。一般不版本化的东西包括classes,build输出目录,.cvsignore等

3.fisheye
fisheye的功能类似于svn log(subclipse通过team-show history查看,tortoisesvn通过show log查看)。
当然fisheye是web界面查看的,通过功能远远强于svn log,同时fisheye还支持cvs,cvs log并没有svn log完善,所以对于cvs来说是相当有用的版本提交历史查看工具。
fisheye的changelog可以清晰的看到何时、何人做了哪些代码的修改,同时可以方便的看到提交的代码同前一版本或者前N版本有何不同。fisheye还有统计图,线性图、柱状图、饼图等。

4.crucible
fisheye仅仅是一个查看版本历史的工具,如果你是一个技术经理或者team leader,在查看项目成员提交的代码时有什么要评判注释的,crucible可以达到这个功能。crucible等于是一个代码审查工具。对代码的review comments还可以通过邮件发送给developer。crucible完全同fisheye结合在一起,安装了crucible就不用安装fisheye了。

5.jira
jira是众所周知的issue tracker,jira也是可以集成svn和fisheye的,而且实用性很强。
比如tester提交了一个bug,developer解决了这个bug,同时提交了几个java类,如果你想看到针对这个bug项目里面的代码做了哪些修改,jira-subversion plugin就发挥作用了。安装好subversion plugin之后,只需要developer在做svn commit的时候在comments里面写上jira id,在jira的subversion tab里面就会显示这个comments和这次提交的文件。

而jira fisheye plugin则是将fisheye的功能集成到jira中,同时也是随jira id来显示版本的变更记录。


注:
1)目前最新的atlassian-jira-subversion-plugin-0.10.3 不支持svn 1.5,不过通过升级svnkit到1.1.8以上版本就能解决这个问题。
2)fisheye plugin配置时,记得在fisheye管理界面中把Remote API设置成ON,要不然plugin连不上fisheye的!

你可能感兴趣的:(版本管理)