做了多时的软件开发项目管理,深知代码管理在软件项目开发的过程中的重要位置,于是想到把遇到的关于代码管理方面的经验和问题记下,以供日后补充参考。目前在这个领域运用最为广泛的莫过于CVS和SVN两者,在实际运用中发现其实他们都同样非常优秀,以下我总结一下 CVS 的日常使用(夹杂与 SVN 的对比):
日常运用 :
cvs init : CVS版本库的初始化
cvs import -m "write some comments here" project_name vendor_tag release_tag : 一个项目的***导入
cvs checkout(co) project_name : 将代码从CVS库里导出#与SVN同#
cvs update(up) file_name : 将文件同步到***的版本#与SVN同#
cvs update : 将当前目录同步到***的版本#与SVN同#
cvs commit(ci) -m "write some comments here" file_name : 确认修改写入到CVS库里#与SVN同#
cvs admin -m 1.3:"write some comments here" file_name : 修改某个版本注释
cvs add new_file : 创建好新文件后添加文件#与SVN同#
cvs add -kb new_file.gif : 按二进制文件方式导入#与SVN同#
cvs admin -kkv new_file.css : 改回ASCII文件方式导入
cvs ci -m "write some comments here" : 然后确认修改并注释#与SVN同#
cvs rm file_name : 将某个源文件物理删除后(删除后需要cvs ci -m "comments"一下)
cvs add dir_name : 添加目录#与SVN同#
cvs log file_name / cvs history file_name : 查看修改历史#与SVN同#
cvs diff(di) -r1.3 -r1.5 file_name : 查看当前文件不同版本的区别#与SVN同#
cvs diff file_name : 查看当前文件(可能已经修改了)和库中相应文件的区别#与SVN同#
* notice : cvs里没有cvs move或cvs rename,因为这两个操作是可以由先cvs remove old_file_name,然后cvs add new_file_name实现的。
项目发布导出不带CVS目录的源文件#与SVN同# :
cvs export -r release1 project_name
cvs export -D 20021023 project_name
cvs export -D now project_name
多项目并发管理#与SVN不同#参考文件***的NOTICE# :
cvs tag release_1_0 : 建立版本里程碑
cvs commit -r 2 : 开始一个新的里程碑(标记所有文件开始进入2.x的开发)
cvs rtag -b -r release_1_0 release_1_0_patch proj_dir : 版本分支的建立(在开发项目的2.x版本的时候发现1.x有问题,但2.x又不敢用,则从先前标记的里程碑:release_1_0导出一个分支 release_1_0_patch)
cvs checkout -r release_1_0_patch : 一些人先在另外一个目录下导出release_1_0_patch这个分支:解决1.0中的紧急问题,而其他人员仍旧在项目的主干分支2.x上开发
cvs tag release_1_0_patch_1 : 在release_1_0_patch上修正错误后,标记一个1.0的错误修正版本号
cvs update -j release_1_0_patch_1 : 如果2.0认为这些错误修改在2.0里也需要,也可以在2.0的开发目录下合并release_1_0_patch_1中的修改到当前代码中
cvs (-d :pserver:cvs_user_name@cvs.server.address:/path/to/cvsroot) login : 常见的登陆格式
cvs (-d xxx) passwd -a user_name : 添加用户
cvs (-d xxx) passwd -r system_user user_name : 绑定用户
cvs (-d xxx) passwd -X user_name : 删除用户
* notice : 也可以通过设置CVSROOT系统参数使得所有客户机所有本地用户都可以映射到CVS服务器相应同名帐号
* notice : 将 $Id$ 加在程序文件开头的注释里是一个很好的习惯
CVSNT 里面还有一个问题就是:添加的用户登录时有可能出现 Fatal error, aborting. administrator: no such user 此类的错误,那么我们需要在CVSNT的Server Settings中把client user设置一下,一般设置成 administrator 即可。
目前 My Team 统一使用 Eclipse 开发工具,以下是一篇关于 Eclipse CVS 使用的文章,以供参考:http://www.eclipse.org/articles/article.php?file=Article-BranchingWithEclipseAndCVS/article1.html.
* notice : 注意右键菜单下面 Team/Compare with/Replace With 菜单的用法基本上就掌握了基本的 Eclipse CVS Plugin 的用法了~
* notice : svn的多任务管理与cvs不同,svn中的branch实际上是复制一份当前的repository,然后可以并行地分别修改。复制采用cheap copy机制,类似于unix系统中的硬链接,branch操作不会使repository所占用的空间倍增,花费的时间也是常数级别的。svn中没有单独的branch命令,通过svn copy来实现。
这里有一点容易让人糊涂,因为svn中的版本号都是指repository,所以不同branch的版本号是混合交叉的,比如trunk为r60,svn copy之后会创建r61的branch,对trunk修改后再commit就成了r62。
svn中的merge并非字面上所示的将两个分支归并到一起,而是diff-and-apply的意思,比较两个repository tree,并将他们的差异归并到working-copy中。这里merge并不区分两个repository tree是否处于不同的分支,也不会验证working-copy的源头,所以使用这个功能的时候要自己小心。
当我们创建了一个branch,并且对trunk和branch分别进行了比较大的修改,现在想要把branch中的修改归并到trunk中,此时应该 merge的对象并不是trunk和branch的***版本,而应该是branch的起始版本和***版本。因为merge实际上只是做一个diff,所以前者在将branch的修改归并到trunk的同时也让对trunk的修改丢失了。
原文链接:http://blog.csdn.net/shagoo/article/details/3975931
【编辑推荐】