咱们在一些著名开源项目的版本库中,一般能够看到trunk, branches, tags等三个目录。因为SVN固有的特色,目录在SVN中并无特别的意义,可是这三个目录却在大多数开源项目中存在,这是由于这三个目录反映了软件开发的一般模式。svn
trunk是主分支,是平常开发进行的地方。学习
branches是分支。一些阶段性的release版本,这些版本是能够继续进行开发和维护的,则放在branches目录中。又好比为不一样用户客制化的版本,也能够放在分支中进行开发。测试
tags目录通常是只读的,这里存储阶段性的发布版本,只是做为一个里程碑的版本进行存档。编码
好比一个项目有main.cpp, common.h两个文件,假设目前在开发的是最新的3.0版本,并且1.0/2.0版本也在进行维护,那么项目树将相似以下样子:翻译
project
|
+-- trunk
+ |
+ +----- main.cpp (3.0版本的最新文件)
+ +----- common.h
+
+-- branches
+ |
+ +-- r1.0
+ + |
+ + +---- main.cpp (1.x版本的最新文件)
+ + +---- common.h
+ +
+ +-- r2.0
+ |
+ +---- main.cpp (2.x版本的最新文件)
+ +---- common.h
+
+-- tags (此目录只读)
|
+-- r1.0
+ |
+ +---- main.cpp (1.0版本的发布文件)
+ +---- common.h
+
+-- r1.1
+ |
+ +---- main.cpp (1.1版本的发布文件)
+ +---- common.h
+
+-- r1.2
+ |
+ +---- main.cpp (1.2版本的发布文件)
+ +---- common.h
+
+-- r1.3
+ |
+ +---- main.cpp (1.3版本的发布文件)
+ +---- common.h
+
+-- r2.0
+ |
+ +---- main.cpp (2.0版本的发布文件)
+ +---- common.h
+
+-- r2.1
|
+---- main.cpp (2.1版本的发布文件)
+---- common.h
要使用这样的文件夹结构,在创建项目版本库时,可首先建好项目文件夹,并在其中创建trunk, branches, tags三个空的子目录,再将项目文件夹连同这三个子目录一块儿导入版本库。设计
这样在trunk中开始进行开发,当须要创建branch或tag时,使用SVN的copy操做进行。版本控制
其中tags目录须要只读,可使用SVN中的authz文件控制该目录的访问权限为只读。
本节主要讲解一下SVN中tag branch trunk的用法,在SVN中Branch/tag在一个功能选项中,在使用中也每每产生混淆。这里就向你们简单介绍一下,欢迎你们能和我一块儿学习SVN中tag branch trunk的用法。
在实现上,branch和tag,对于svn都是使用copy实现的,因此他们在默认的权限上和通常的目录没有区别。至于什么时候用tag,什么时候用 branch,彻底由人主观的根据规范和须要来选择,而不是强制的(好比cvs)。通常状况下,tag,是用来作一个milestone的,无论是否是 release,都是一个可用的版本。这里,应该是只读的。更多的是一个显示用的,给人一个可读(readable)的标记。branch,是用来作并行 开发的,这里的并行是指和trunk进行比较。好比,3.0开发完成,这个时候要作一个tag,tag_release_3_0,而后基于这个tag作 release,好比安装程序等。trunk进入3.1的开发,可是3.0发现了bug,那么就须要基于tag_release_3_0作一个 branch,branch_bugfix_3_0,基于这个branch进行bugfix,等到bugfix结束,作一个 tag,tag_release_3_0_1,而后,根据须要决定branch_bugfix_3_0是否并入trunk。对于svn还要注意的一点,就 是它是全局版本号,其实这个就是一个tag的标记,因此咱们常常能够看到,什么什么release,基于xxx项目的2xxxx版本。就是这个意思了。但 是,它还明确的给出一个tag的概念,就是由于这个更加的可读,毕竟记住tag_release_1_0要比记住一个很大的版本号容易的多。日志
branches:分枝
SVN中tag branch trunk的用法,首先看一下branches的介绍。当多我的合做,可能有这样的状况出现:John忽然有个想法,跟原先的设计不太一致,多是功能的 添加或者日志格式的改进等等,总而言之,这个想法可能须要花一段时间来完成,而这个过程当中,John的一些操做可能会影响Sally的工做,John从现 有的状态单独出一个project的话,又不能及时获得Sally对已有代码作的修正,并且独立出来的话,John的尝试成功时,跟原来的合并也存在困 难。这时最好的实践方法是使用branches。John创建一个本身的branch,而后在里面实验,必要的时候从Sally的trunk里取得更新, 或者将本身的阶段成果聚集到trunk中。
(svncopySourceURL/trunkDestinationURL/branchName-m"Creatingaprivatebranchofxxxx/trunk.")视频
trunk:主干
主干,通常来讲就是开发的主要呆的地方,
tag: 图标
在通过了一段时间的开发后,项目到达了一个里程碑阶段,你可能想记录这一阶段的代码的状态,那么你就须要给代码打上标签。
(svncpfile:///svnroot/mojavescripts/trunkfile:///svnroot/mojavescripts /tags/mirrorutils_rel_0_0_1-m"tagedmirrorutils_rel_0_0_1")另有一说,无所谓谁对谁错。
trunk:表示开发时版本存放的目录,即在开发阶段的代码都提交到该目录上。
branches:表示发布的版本存放的目录,即项目上线时发布的稳定版本存放在该目录中。
tags:表示标签存放的目录。
在这须要说明下分三个目录的缘由,若是项目分为一期、二期、三期等,那么一期上线时的稳定版本就应该在一期完成时将代码copy到branches上,这 样二期开发的代码就对一期的代码没有影响,如新增的模块就不会部署到生产环境上。而branches上的稳定的版本就是发布到生产环境上的代码,若是用户 使用的过程当中发现有bug,则只要在branches上修改该bug,修改完bug后再编译branches上最新的代码发布到生产环境便可。tags的 做用是将在branches上修改的bug的代码合并到trunk上时建立个版本标识,之后branches上修改的bug代码再合并到trunk上时就 从tags的version到branches最新的version合并到trunk,以保证前期修改的bug代码不会再合并。
-------------------------------------------------------------------------------------------
介绍SVN中tag branch trunk用法时,一直以来用svn只是看成cvs,也历来没有仔细看过文档,直到今天用到,才去翻看svnbook文档,惭愧
需求一:
有一个客户想对产品作定制,可是咱们并不想修改原有的svn中trunk的代码。
方法:
用svn创建一个新的branches,从这个branche作为一个新的起点来开发
svncopysvn://server/trunksvn://server/branches/ep-m"initep"
Tip:
若是你的svn中之前没有branches这个的目录,只有trunk这个,你能够用
svnmkdirbranches新建个目录server
需求二:
产品开发已经基本完成,而且经过很严格的测试,这时候咱们就想发布给客户使用,发布咱们的1.0版本
svncopysvn://server/trunksvn://server/tags/release-1.0-m"1.0released"咦,这个和branches有什么区别,好像啥区别也没有?
是的,branches和tags是同样的,都是目录,只是咱们不会对这个release-1.0的tag作修改了,再也不提交了,若是提交那么就是branches
需求三:
有一天,忽然在trunk下的core中发现一个致命的bug,那么全部的branches必定也同样了,该怎么办?
svn-r148:149mergesvn://server/trunkbranches/ep其中148和149是两次修改的版本号。SVN中tag branch trunk用法介绍完毕。
本文主要讲解一下SVN组成trunk,branches and tags,主要包括其概念的讲解、用法的比较,相信看完本文你确定有很多收获,但愿本文能教会你更多东西。
在本篇文章中,我将会详细说明我是如何应用SVNtrunk(树干)、branches(分支)和tags(标记)。这种方法一样被称为 “branchalways”,二者很是接近。可能我所介绍的并非最好的方法,可是它会给新手一些解释说明,告诉他们trunk、branches和 tags是什么,而且该如何去应用它们。
固然,若是本文有些要点须要澄清/确认,亦或者有一些错误的观点,还请你评论,自由发表本身的观点。——简单的对比SVN的工做机制在某种程度上就像一颗正在生长的树:一颗有树干和许多分支的树分支从树干生长出来,而且细的分支从相对较粗的树干中长出一棵树能够只有树干没有分支(可是这种状况不会持续好久,随着树的成长,确定会有分支啦,^^)一颗没有树干可是有不少分支的树看起来更像是地板上的一捆树枝若是树干患病了,最终分支也会受到影响,而后整棵树就会死亡若是分支患病了,你能够剪掉它,而后其余分支还会生长出来的哦!若是分支生长太快了,对于树干它可能会很是沉重,最后整棵树会垮塌掉当你感受你的树、树干或者是分支看起来很漂亮的时候,你能够给它照张相,这样就就能够记得它在那时是多么的赞。——TrunkaSVN组成Trunka,Trunk是放置稳定代码的主要环境,就好像一个汽车工厂,负责将成品的汽车零件组装在一块儿。如下内容将告诉你如何使用SVNtrunk:除非你必须处理一些容易且能迅速解决的BUG,或者你必须添加一些无关逻辑的文件(好比媒体文件:图像,视频,CSS等等),不然永远不要在trunk直接作开发不要由于特殊的需求而去对先前的版本作太大的改变,如何相关的状况都意味着须要创建一个branch(以下所述)不要提交一些可能破坏trunk的内容,例如从branch合并若是你在某些时候偶然间破坏了trunk,bringsomecakethenextday(”withgreatresponsibilitiescome…hugecakes”)——BranchesSVN组成branches,一个branch就是从一个SVN仓库中的子树所做的一份普通拷贝。一般状况它的工做相似与UNIX系统上的符号连接,可是 你一旦在一个SVNbranch里修改了一些文件,而且这些被修改的文件从拷贝过来的源文件独立发展,就不能这么认为了。当一个branch完成了,而且 认为它足够稳定的时候,它必须合并回它原来的拷贝的地方,也就是说:若是原来是从trunk中拷贝的,就应该回到trunk去,或者合并回它原来拷贝的父 级branch。如下内容将告诉你如何使用SVNbranches:若是你须要修改你的应用程序,或者为它开发一个新的特性,请从trunk中建立一个新的branch,而后基于这个新的分支进行开发除非是由于必须从一个branch中建立一个新的子branch,不然新的branch必须从trunk建立当你建立了一个新branch,你应当当即切换过去。若是你没有这么作,那你为何要在最初的地方建立这个分支呢?——TagsSVN组成Tags。从表面上看,SVNbranches和SVNtags没有什么差异,可是从概念上来讲,它们有许多差异。其实一个SVNtags就是上文所述的“为这棵树照张相”:一个trunk或者一个branch修订版的命名快照。如下内容将告诉你如何使用SVNtags:做为一个开发者,永远不要切换至、取出,或者向一个SVNtag提交任何内容:一个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)——工做流样例假设你必须添加了一个特性至一个项目,且这个项目是受版本控制的,你差很少须要完成以下几个步骤:使用SVNcheckout或者SVNswitch从这个项目的trunk得到一个新的工做拷贝(branch)使用SVN切换至新的branch完成新特性的开发(固然,要作足够的测试,包括在开始编码前)一旦这个特性完成而且稳定(已提交),并通过你的同事们确认,切换至trunk合并你的分支至你的工做拷贝(trunk),而且解决一系列的冲突从新检查合并后的代码若是可能的话,麻烦你的同事对你所编写、更改的代码进行一次复查(review)提交合并后的工做拷贝至trunk若是某些部署须要特殊的环境(生成环境等等),请更新相关的tag至你刚刚提交到trunk的修订版本,使用SVNupdate部署至相关环境Tags:svn,翻译。SVN组成中trunk,branches and tags概念、功能和用法等介绍完毕。请关注本节的其余报道。