因水平所限,如果翻译得和原文有差,敬请评论指正。

  在本篇文章中, 我将会详细说明我是如何应用SVN trunk(树干)、branches(分支)和tags(标记)。这种方法同样被称为“branch always”,两者非常接近。可能我所介绍的并不是最好的方法,但是它会给新手一些解释说明,告诉他们trunk、branches和tags是什么,并且该如何去应用它们。

 

  当然,如果本文有些要点需要澄清/确认,亦或者有一些错误的观点,还请你评论,自由发表自己的观点。

——简单的对比

  SVN的工作机制在某种程度上就像一颗正在生长的树:

一棵有树干和许多分支的树 分支从树干生长出来,并且细的分支从相对较粗的树干中长出 一棵树可以只有树干没有分支(但是这种情况不会持续很久,随着树的成长,肯定会有分支啦,^^) 一颗没有树干但是有很多分支的树看起来更像是地板上的一捆树枝 如果树干患病了,最终分支也会受到影响,然后整棵树就会死亡 如果分支患病了,你可以剪掉它,然后其他分支还会生长出来的哦! 如果分支生长太快了,对于树干它可能会非常沉重,最后整棵树会垮塌掉 当你感觉你的树、树干或者是分支看起来很漂亮的时候,你可以给它照张相,这样就就可以记得它在那时是多么的赞。

——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)

——工作流样例

  假设你必须添加了一个特性至一个项目,且这个项目是受版本控制的,你差不多需要完成如下几个步骤:

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

翻译者:zwws
原 文:SVN trunk, branches and tags
译 言:http://article.yeeyan.org/view/132319/81358

还有一种说法: 都不知该怎么做了,上面文章和下面文章说的有些出入,但 tags 似乎说的相同,但 trunk 和 branches 差别就大了 !

trunk:表示开发时版本存放的目录,即在开发阶段的代码都提交到该目录上。( 生产环境 ? )
branches:表示发布的版本存放的目录,即项目上线时发布的稳定版本存放在该目录中。

tags:表示标签存放的目录。

在这需要说明下分三个目录的原因,如果项目分为一期、二期、三期等,那么一期上线时的稳定版本就应该在一期完成时将代码copy到branches 上,这样二期开发的代码就对一期的代码没有影响,如新增的模块就不会部署到生产环境上。而branches上的稳定的版本就是发布到生产环境上的代码,如 果用户使用的过程中发现有bug,则只要在branches上修改该bug,修改完bug后再编译branches上最新的代码发布到生产环境即可。 tags的作用是将在branches上修改的bug的代码合并到trank上时创建个版本标识,以后branches上修改的bug代码再合并到 trunk上时就从tags的version到branches最新的version合并到trunk,以保证前期修改的bug代码不会在合并。
需求一:

有一个客户想对产品做定制,但是我们并不想修改原有的svn中trunk的代码。

方法:

用svn建立一个新的branches,从这个branche做为一个新的起点来开发

代码
svn copy svn://server/trunksvn://server/branches/ep -m “init ep”

<script>render_code();</script>

Tip: 如果你的svn中以前没有branches这个的目录,只有trunk这个,你可以用

代码

svn mkdir branches

<script>render_code();</script>
新建个目录

需求二: 产品开发已经基本完成,并且通过很严格的测试,这时候我们就想发布给客户使用,发布我们的1.0版本

代码

svn copy svn://server/trunksvn://server/tags/release-1.0 -m “1.0 released”

<script>render_code();</script>

咦,这个和branches有什么区别,好像啥区别也没有?
是的,branches和tags是一样的,都是目录,只是我们不会对这个release-1.0的tag做修改了,不再提交了,如果提交那么就是branches

需求三:有一天,突然在trunk下的core中发现一个致命的bug,那么所有的branches一定也一样了,该怎么办?

代码

svn -r 148:149 merge svn://server/trunk branches/ep

<script>render_code();</script>

posted on 2012-02-21 10:37  Louis.Lu.Sz  阅读(454)  评论(0编辑  收藏  举报