svn第一篇----入门指南

摘要:trunk存放的是主代码,不修改,branch,tag,milestone均是从trunk中衍生的。branch复制trunk中代码用于开发,tag用于存放比较重要的发行版,存放release版本的代码和bug——fix版本的代码快照,milestone应该是比较重要的tag.工作流程看第3部分内容。

1 简单介绍

所谓的Tag或是Release就是一个特别的版本,因为这个版本可能有特别的意义。例如:这个版本是特别的Milestone或是release给客户的版本。其实,Tag与Release的作法与Branch完全相同。只是Branch可能会需要merge回原来的trunk中,而tag及release大部分都不需要merge回trunk中。举例来说,今天我们的trunk做了一版,这个版本被认定是软件的1.0版。1.0版对于开发来说是一个非常重要的里程碑。所以我们要特别为他做一个标记,亦即Tag。假设,这个 1.0版是要正式release给客户或是相关vendor,我们要可以为他做一个Release的标记。

2 概念介绍

——Trunk   Trunk是放置稳定代码的主要环境,就好像一个汽车工厂,负责将成品的汽车零件组装在一起。   以下内容将告诉你如何使用SVN trunk:
  • 除非你必须处理一些容易且能迅速解决的BUG,或者你必须添加一些无关逻辑的文件(比如媒体文件:图像,视频,CSS等等),否则永远 不要在trunk直接做开发
  • 不要因为特殊的需求而去对先前的版本做太大的改变,如何相关的情况都意味着需要建立一个branch(如下所述)
  • 不要提交一些可能破坏trunk的内容,例如从branch合并
  • 如果你在某些时候偶然间破坏了trunk,bring some cake the next day (”with great responsibilities come… huge cakes”)
——Branches   一个branch就是从一个SVN仓库中的子树所作的一份普通拷贝。通常情况它的工作类似与UNIX系统上的符号链接,但是你一旦在一个SVN branch里修改了一些文件,并且这些被修改的文件从拷贝过来的源文件独立发展,就不能这么认为了。当一个branch完成了,并且认为它足够稳定的时 候,它必须合并回它原来的拷贝的地方,也就是说:如果原来是从trunk中拷贝的,就应该回到trunk去,或者合并回它原来拷贝的父级branch。   以下内容将告诉你如何使用SVN branches:
  • 如果你需要修改你的应用程序,或者为它开发一个新的特性,请从trunk中创建一个新的branch,然后基于这个新的分支进行开发
  • 除非是因为必须从一个branch中创建一个新的子branch,否则新的branch必须从trunk创建
  • 当你创建了一个新branch,你应当立即切换过去。如果你没有这么做,那你为什么要在最初的地方创建这个分支呢?
——Tags   从表面上看,SVN branches和SVN tags没有什么差别,但是从概念上来说,它们有许多差别。其实一个SVN tags就是上文所述的“为这棵树照张相”:一个trunk或者一个branch修订版的命名快照。   以下内容将告诉你如何使用SVN tags:
  • 作为一个开发者,永远不要切换至、取出,或者向一个SVN tag提交任何内容:一个tag好比某种“照片”,并不是实实在在的东西,tags只可读,不可写。
  • 在特殊或者需要特别注意的环境中,如:生产环境(production)、?(staging)、测试环境(testing)等等,只 能从一个修复过的(fixed)tag中checkout和update,永远不要commit至一个tag。
  • 对于上述提及到的环境,可以创建如下的tags:“production”,“staging”,“testing”等等。你也可以根 据软件版本、项目的成熟程度来命名tag:“1.0.3”,“stable”,“latest”等等。
  • 当trunk已经稳定,并且可以对外发布,也要相应地重新创建tags,然后再更新相关的环境(production, staging, etc)

3 工作流程 

     假设你必须添加了一个特性至一个项目,且这个项目是受版本控制的,你差不多需要完成如下几个步骤:
  1. 使用SVN checkout或者SVN switch从这个项目的trunk获得一个新的工作拷贝(branch)
  1. 使用SVN切换至新的branch
  1. 完成新特性的开发(当然,要做足够的测试,包括在开始编码前)
  1. 一旦这个特性完成并且稳定(已提交),并经过你的同事们确认,切换至trunk
  1. 合并你的分支至你的工作拷贝(trunk),并且解决一系列的冲突
  1. 重新检查合并后的代码
  1. 如果可能的话,麻烦你的同事对你所编写、更改的代码进行一次复查(review)
  1. 提交合并后的工作拷贝至trunk
  1. 如果某些部署需要特殊的环境(生成环境等等),请更新相关的tag至你刚刚提交到trunk的修订版本
  1. 使用SVN update部署至相关环境

  4 深入讲解

Subversion有一个很标准的目录结构,是这样的。 比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/|+-trunk+-branches+-tags 这是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。但是具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯。 对于这几个开发目录,一般的使用方法有两种。我更多的是从软件产品的角度出发(比如freebsd),因为互联网的开发模式是完全不一样的。 第一种方法,使用trunk作为主要的开发目录。 一般的,我们的所有的开发都是基于trunk进行开发,当一个版本/release开发告一段落(开发、测试、文档、制作安装程序、打包等)结束后,代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。当下一个版本/阶段的开发任务开始,继续在trunk进行开发。 此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag,做相应的分支(branch)进行开发。 例如,刚刚发布1.0,正在开发2.0,此时要在1.0的基础上进行bug修正。 按照时间的顺序 1.0开发完毕,代码冻结  基于已经冻结的trunk,为release1.0打tag 此时的目录结构为 svn://proj/              +trunk/ (freeze)              +branches/              +tags/                      +tag_release_1.0 (copy from trunk)  2.0开始开发,trunk此时为2.0的开发版  发现1.0有bug,需要修改,基于1.0的tag做branch 此时的目录结构为 svn://proj/              +trunk/ ( dev 2.0 )              +branches/                            +dev_1.0_bugfix (copy from tag/release_1.0)              +tags/                      +release_1.0 (copy from trunk)  在1.0 bugfix branch进行1.0 bugfix开发,在trunk进行2.0开发  在1.0 bugfix 完成之后,基于dev_1.0_bugfix的branch做release等  根据需要选择性的把dev_1.0_bugfix这个分支merge回trunk(什么时候进行这步操作,要根据具体情况)  这是一种很标准的开发模式,很多的公司都是采用这种模式进行开发的。trunk永远是开发的主要目录。 第二种方法,在每一个release的branch中进行各自的开发,trunk只做发布使用。 这种开发模式当中,trunk是不承担具体开发任务的,一个版本/阶段的开发任务在开始的时候,根据已经release的版本做新的开发分支,并且基于这个分支进行开发。还是举上面的例子,这里面的时序关系是。 1.0开发,做dev1.0的branch 此时的目录结构 svn://proj/              +trunk/ (不担负开发任务 )              +branches/                            +dev_1.0 (copy from trunk)              +tags/  1.0开发完成,merge dev1.0到trunk 此时的目录结构 svn://proj/              +trunk/ (merge from branch dev_1.0)              +branches/                            +dev_1.0 (开发任务结束,freeze)              +tags/  根据trunk做1.0的tag 此时的目录结构 svn://proj/              +trunk/ (merge from branch dev_1.0)              +branches/                            +dev_1.0 (开发任务结束,freeze)              +tags/                      +tag_release_1.0 (copy from trunk)  1.0开发,做dev2.0分支 此时的目录结构 svn://proj/              +trunk/               +branches/                            +dev_1.0 (开发任务结束,freeze)                            +dev_2.0 (进行2.0开发)              +tags/                      +tag_release_1.0 (copy from trunk)  1.0有bug,直接在dev1.0的分支上修复 引用地址: 

5  svn代码回滚命令

取消对代码的修改分为两种情况:   第一种情况:改动没有被提交(commit)。 这种情况下,使用svn revert就能取消之前的修改。 svn revert用法如下: # svn revert [-R] something 其中something可以是(目录或文件的)相对路径也可以是绝对路径。 当something为单个文件时,直接svn revert something就行了;当something为目录时,需要加上参数-R(Recursive,递归),否则只会将something这个目录的改动。 在这种情况下也可以使用svn update命令来取消对之前的修改,但不建议使用。因为svn update会去连接仓库服务器,耗费时间。 注意:svn revert本身有固有的危险,因为它的目的是放弃未提交的修改。一旦你选择了恢复,Subversion没有方法找回未提交的修改。   第二种情况:改动已经被提交(commit)。 这种情况下,用svn merge命令来进行回滚。     回滚的操作过程如下:     1、保证我们拿到的是最新代码:       svn update       假设最新版本号是28。     2、然后找出要回滚的确切版本号:       svn log [something]      假设根据svn log日志查出要回滚的版本号是25,此处的something可以是文件、目录或整个项目      如果想要更详细的了解情况,可以使用svn diff -r 28:25 [something]    3、回滚到版本号25:        svn merge -r 28:25 something      为了保险起见,再次确认回滚的结果:        svn diff [something]      发现正确无误,提交。    4、提交回滚:      svn commit -m "Revert revision from r28 to r25,because of ..."       提交后版本变成了29。    将以上操作总结为三条如下:    1. svn update,svn log,找到最新版本(latest revision)    2. 找到自己想要回滚的版本号(rollbak revision)    3. 用svn merge来回滚: svn merge -r : something 、转载自:http://www.cnblogs.com/jndream/archive/2012/03/20/2407955.html

posted @ 2013-08-05 10:00  唐僧吃肉  阅读(227)  评论(0编辑  收藏  举报