在公司开发中,代码一直是使用svn管理,虽然是用svn管理,但是一直只是把svn作为简单的代码仓库来使用,并没有使用svn的其它功能,所有的人都在master上作修改提交,所以代码的管理相对较混乱,上线不好做版本发布,因为我可能提交了多次,中间其他童鞋也提交了n次,有可能出现了版本冲突,导致最后版本发布上线极为麻烦。
在平常自己的开发中源码都是基于git来管理(),虽然版本中只有我一个人进行开发,但是还是采取了分支开发方式。分支开发相对于比较清晰,在分支上进行开发完成后在进行合并到master上,然后从master进行提交。因为git的版本管理事分布式的,本地就是版本仓库,这样的管理方式相当实用,当然分支版本也是可以pull到仓库上的。
在一些情况下不得不引入branch的开发方式,虽然svn也是支持brach的开发的,但是相对于git来说svn的branch较为原始,svn的branch是以直接copy来进行实现的,在mereg的时候也是对两个文件夹进行操作。但是这样做的缺点就是代码管理中就需要多了一个版本库代码的copy,不像git一样只是在同一个文件夹中就可以完成一个或者多个branch的管理。
公司还是使用svn进行代码管理,所以这里就简单实践了一下svn的分支开发方式,也作了一个简单的记录。
首先来说一下svn版本库有一个较为标准的目录结构,比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是
svn://proj/ | +-trunk +-branches +-tags
trunk为主开发目录,branches为分支开发目录,tags为tag存档目录
下面以开发的一个项目作为例子进行说明:
首先check代码库
sh-3.2# svn checkout svn://172.16.0.245/book.2345.com/ book_test.2345.comsh-3.2# cd /opt/case/book_test.2345.com/sh-3.2# ls.svn branches tags trunk
主分支是trunk,创建的分支我这里放在了branches
接下来我们进行分支的创建
sh-3.2# svn copy trunk branches/zhangwj_20140208A branches/zhangwj_20140208sh-3.2# svn commit -m "create new branch" ./*Adding branches/zhangwj_20140208Committed revision 123460.sh-3.2# cd /opt/case/book_test.2345.com/branches/zhangwj_20140208/
然后在这个分支下面进行新文件的开发并提交svn服务器
sh-3.2# touch demo.phpsh-3.2# svn add demo.php A demo.phpsh-3.2# svn commit -m "add new file" demo.php Adding demo.phpTransmitting file data .Committed revision 123461.
这个时候分支与主干的代码就会不一样,这个时候我们首先把主干上的代码合并到分支上来(如果主干进行修改了的话),分支测试完成之后再将分支代码合并代码主干上面去。
sh-3.2# svn log --verbose --stop-on-copy svn://172.16.0.245/book.2345.com/branches/zhangwj_20140208/------------------------------------------------------------------------r123461 | weijian | 2014-02-08 19:01:42 +0800 (Sat, 08 Feb 2014) | 1 lineChanged paths: A /book.2345.com/branches/zhangwj_20140208/demo.phpadd new file------------------------------------------------------------------------r123460 | weijian | 2014-02-08 18:59:14 +0800 (Sat, 08 Feb 2014) | 1 lineChanged paths: A /book.2345.com/branches/zhangwj_20140208 (from /book.2345.com/trunk:123459)create new branch------------------------------------------------------------------------
查看分支的最新版本号与主干进行合并
sh-3.2# svn merge -r 123461:HEAD /opt/case/book_test.2345.com/trunk/--- Merging r123462 into '.':U 404.php--- Recording mergeinfo for merge of r123462 into '.': U .
如果同一个文件主干与分支同时进行了修改,解决冲突可以使用svn resolved,或者直接选择想使用的版本
分支开发与测试完成之后,这个时候我们可以把分支的修改与主干进行合并,当然我们首先需要进入主干的目录
sh-3.2# cd /opt/case/book_test.2345.com/trunk/sh-3.2# svn log --verbose --stop-on-copy svn://172.16.0.245/book.2345.com/branches/zhangwj_20140208/------------------------------------------------------------------------r123463 | weijian | 2014-02-08 19:46:55 +0800 (Sat, 08 Feb 2014) | 1 lineChanged paths: M /book.2345.com/branches/zhangwj_20140208/404.phpadd new file------------------------------------------------------------------------r123461 | weijian | 2014-02-08 19:01:42 +0800 (Sat, 08 Feb 2014) | 1 lineChanged paths: A /book.2345.com/branches/zhangwj_20140208/demo.phpadd new file------------------------------------------------------------------------r123460 | weijian | 2014-02-08 18:59:14 +0800 (Sat, 08 Feb 2014) | 1 lineChanged paths: A /book.2345.com/branches/zhangwj_20140208 (from /book.2345.com/trunk:123459)create new branch------------------------------------------------------------------------sh-3.2# svn updatesh-3.2# svn merge -r 123460:HEAD /opt/case/book_test.2345.com/branches/zhangwj_20140208/--- Merging r123461 into '.':A demo.php--- Recording mergeinfo for merge of r123461 through r123464 into '.': G .sh-3.2# svn status M .A + demo.phpsh-3.2# svn commit -m "Merged zhangwj_20140208 changes r123460:123464 into the trunk."Sending .Adding demo.phpCommitted revision 123466.
这个时候主干就已经完成了与分支的合并
这里要注意的是:
svn merge -r 123460:HEAD /opt/case/book_test.2345.com/branches/zhangwj_20140208/这个命令参数-r的值的填充 123460为分支的起始版本号,此版本号可使用如下命令进行查看,最后一条为其实版本号 例如:r123460
svn log --verbose --stop-on-copy 分支地址HEAD为最新版本,也就是后面分支的最新版本
合并完成之后,我们可以根据需要删除之前的分支
sh-3.2# svn rm -m "delete zhangwj_20140208 branch " svn://172.16.0.245/book.2345.com/branches/zhangwj_20140208/Committed revision 123468.
分支建立的规则一般是自己的名字接上当前的日期 例如:zhangwj_20140208
最后再说一句 其实命令行来做代码管理也是挺不错的!