SVN团队开发两种模式以及实际项目应用

本文主要介

概要


  1. 介绍SVN 日常的两种开发模式
  • (1)基本Svn目录结构
  • (2)集中式(trunk进行主要开发)
  • (3)分散式(分支进行主要开发)
  1. 集中式开发模式在CornStone的具体实现

一、SVN 日常的两种开发模式

1.1 基本svn项目结构

Subversion有一个很标准的目录结构,是这样的。比如项目是 proj,svn地址为 svn://proj/,那么标准的 svn 布局是:

最初的项目目录结构

这是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。但是具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯。

trunk:主干,如果说把一个软件项目从开始到消亡比作一个故事的话,主线情节都在这里被SVN记录着。
branches:分支,有很多种用法,比如:版本发布维护分支、新特性开发分支,甚至是缺陷修复分支等等。
tags:标签,或者叫快照,某个版本发布时候,都在这里留档。

1.2 集中式(trunk进行主要开发)

一般的,我们的所有的开发都是基于trunk进行开发,当一个版本/release开发告一段落(开发、测试、文档、制作安装程序、打包等)结束后,代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。当下一个版本/阶段的开发任务开始,继续在trunk进行开发。
此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag,做相应的分支(branch)进行开发。
例如,刚刚发布1.0,正在开发2.0,此时要在1.0的基础上进行bug修正。按照时间的顺序:



这是一种很标准的开发模式,很多的公司都是采用这种模式进行开发的。trunk永远是开发的主要目录。

1.3 分散式:分支进行主要开发

这种开发模式当中,trunk是不承担具体开发任务的,主要承担版本发布,一个版本/阶段的开发任务在开始的时候,根据已经release的版本做新的开发分支,并且基于这个分支进行开发。还是举上面的例子,这里面的时序关系是。

QQ20170622-115821@2x.png

这其实是一种分散式的开发,当各个部分相对独立一些(功能性的),可以开多个dev的分支进行开发,这样各人/组都不会相互影响。比如dev_2.0_Search和dev_2.0_cache等。但是这样merge起来就是一个很痛苦的事情。
所以,第六步进行选择性的merge,是可以当2.0开发结束后一起把dev_1.0(bugfix用)和dev_2.0(新版本开发用)merge回trunk。或者先把dev_1.0 merge到dev_2.0,进行测试等之后再merge回trunk。
这两种方法各有利弊,第一种方法是可以得到一个比较纯的dev_2.0的开发分支,而第二种方法则更加的保险,因为要测试嘛。
多人协作时,第六步是最经常出问题的地方,严重的甚至会导致代码被覆盖回滚情况,其原因在于分支管理者创建分支后不再或长时间从主干拉回数据,导致最终合并回主干时分支的文件甚至结构都与主干有较大差别,产生较多冲突。需要人手解决,浪费了很多时间。
针对这个问题,是否有一种方案可以在分支提交时即检测该分支最后一次合并的版本是否与主干版本相符,如果不符则不允许提交,强制要求大家养成从主干拉数据的习惯呢?如果可以实现,那么在分支合并回主干时将几乎可以消灭掉冲突。
当前解决思路主要有3种:
不间断强调使用SVN时要经常从主干同步代码到分支。该方案缺点很明显,完全依赖人工,不可信。
在trunk里单独维护一个带最新版本号的readme.md,每次更新trunk时更新该版本到更新的版本号。此后合并分支回主干时判断下分支时的readme.md是否和主干里的readme.md保持一致,若小于主干,则强制同步主干代码到分支。该方案缺点是需要每次更新主干代码时都要强制手工维护版本号,容易出现低级错误——更新trunk时忘记更新readme.md里的版本号等情况。
SVN本身记录版本更新信息,可以通过在服务器端监控主干,判断提交前(pre-commit)检测是否有分支最后一次合并版本号小于主干版本号,如果小于则不允许提交,强制要求先从主干合并。此方案是一种相对完美的方案。

以上呢,就是SVN的两种开发模式了,具体哪种好,并没有定论。这里大致的说一下各自的优缺点:

第一种开发模式(trunk进行主要开发,集中式):
优点:管理简单。
缺点:当开发的模块比较多,开发人数/小团队比较多的时候,很容易产生冲突而影响对方的开发。因为所有的改动都有可能触碰对方的改动。

第二种开发模式(分支进行主要开发,分散式):

优点:各自开发独立,不容易相互影响。
缺点:管理复杂,merge的时候很麻烦,容易死人。

最后,推荐第一种开发模式

整体开发流程

责职说明:
Trunk:用于各版本开发提交代码
TAG:用于记录和保存每个release/milestone的代码
Branch:用于bug fixing

过程说明:

项目开始时,创建Trunk,开始1.0.0开发
所有小组成员都往Trunk中提交代码
当1.0.0开发完成后,创建一个标签:Tag1.0.0
Tag1.0.0测试完成后,部署到服务器
开发小组开始新版本1.0.1开发,继续提交代码到Trunk中
1.0.1开发完成,创建Tag1.0.1,测试完后部署到服务器
开发小组开始新版本1.0.2开发,继续提交代码到Trunk中
1.0.1运行中发现bug,需要紧急修复 -> 从Tag1.0.1中创建1.0.1bug-fix Branch
Bug修复代码提交到1.0.1bug-fix Branch,测试通过后,部署到服务器
提交到1.0.1bug-fix Branch的代码合并到Trunk中.

二、集中式开发模式在CornStone的具体实现

在CornStone的具体实现

2.1 简单介绍下cornerStone的操作面板

这里笔者用的是cornStone 3 V3.0.2版本


工具栏

check out 、update 、commit 这些操作就不说了,这些操作我们日常使用中再熟悉不过了,这里讲下 Tag 与 Branch 以及 Merge 这些操作怎么使用。
Tag 与 Branch 以及cheakOut操作是基于服务器目录的,而update 、commit 以及Merge这些是基于我们本地的工程目录。


image.png

当一个工程从公司的服务器上checkout下来我们就可以看到以上的目录结构,cornstone比较形象化,上面那个服务器样的图标就是服务器上的目录,下面那个就是你本地工程的文件地址。明白这个下面的操作就比较好做了。

具体实现步奏:

1.我们本地新建一个工程命名为svnDevTest并Import到服务器工程目录trunk下


2.在本地工程进行dev_v1.0版本开发,开发完毕打包工程,点击cornstone 左侧服务器目录并点击project/iOS/trunk/svnDevTest 这时候 tag 与 branch 会从不可点击状态 变为可点击状态,

image.png

点击tag在弹出的菜单中,填好tag打包的名称(release_v1.0),并选择好打包的服务器文件路径(这里是project/tag).

image.png

3.这时候项目需要做V1.1版本的开发,开发途中用户使用发现V1.0项目有Bug急需处理,V1.1版本还不到能上架发布的程度,这时候我们就可以用branch操作将我们之前发布的project/tag/release_v1.0做一个分支放到project/branch目录下并将分支工程命名为bugfix_V1.0,branch操作和tag操作一样,这里就不再描述了。这时候我们的工程目录就会像下面这样。

image.png
  1. V1.0版本问题解决,准备打包V1.1版本。这时候我们需要将我们在bugfix_V1.0的改动合并到我们的主干开发中来(即trunk目录),点击cornstone 左侧目录并选择我们本地trunk目录下的工程,点击Merge在弹出的菜单中选择我们需要合并的分支,有冲突的话处理冲突,处理完后(也就是说bugfix_V1.0对1.0版本问题的修复代码已经合并到开发主干上(trunk))就可以将合并的改动commit到主干上了。

这时候我们再看下三个目录的log记录:


thunk_Log目录.png
branch_log.png
tag_log.png

trunk目录记录了,除打包之外工程的所有改动记录。release只记录了打包相关。
参考文献:
SVN 版本管理:两种开发模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容