你知道SVN标准目录结构?

SVN
我们在一些著名开源项目的版本库中,通常可以看到trunk, branches, tags等三个目录。由于SVN固有的特点,目录在SVN中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式。

我们在一些著名开源项目的版本库中,通常可以看到trunk、branches、tags等三个目录。由于SVN固有的特点,目录在SVN中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式。如下图(为了测试SVN创建的一个测试项目):

SVN标准结构

trunk

trunk目录是主分支,是日常开发进行的地方。

branches

branches是分支。一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中。又比如为不同用户客定制化的版本,也可以放在分支中进行开发。

当多个人合作,可能有这样的情况出现:John突然有个想法,跟原先的设计不太一致,可能是功能的添加或者日志格式的改进等等,总而言之,这个想法可能需要花一段时间来完成,而这个过程中,John的一些操作可能会影响Sally的工作,John从现有的状态单独出一个project的话,又不能及时得到Sally对已有代码做的修正,而且独立出来的话,John的尝试成功时,跟原来的合并也存在困难。这时最好的实践方法是使用branches。John建立一个自己的branch,然后在里面实验,必要的时候从Sally的trunk里取得更新,或者将自己的阶段成果汇集到trunk中。

tags

tags目录一般是只读的,这里存储阶段性的发布版本,只是作为一个里程碑的版本进行存档。

实例一

假如我们有一个SVN-Test项目,假设目前在开发的是最新的3.0版本,而且1.0/2.0版本也在进行维护,那么项目树将类似如下样子:

SVN实例结构图

注意:

  • 要使用这样的文件夹结构,在建立项目版本库时,可首先建好项目文件夹,并在其中建立trunk, branches, tags三个空的子目录,再将项目文件夹连同这三个子目录一起导入版本库。

  • 这样在trunk中开始进行开发,当需要建立branch或tag时,使用SVN的copy操作进行。

  • 其中tags目录需要只读,可以使用SVN中的authz文件控制该目录的访问权限为只读。

在实现上,branch和tag,对于svn都是使用copy实现的,所以他们在默认的权限上和一般的目录没有区别。至于何时用tag,何时用branch,完全由人主观的根据规范和需要来选择,而不是强制的(比如cvs)。

一般情况下,tags是用来做一个milestone(里程碑)的,不管是不是release,都是一个可用的版本。这里应该是只读的。更多的是一个显示用的,给人一个可读(readable)的标记。branch是用来做并行开发的,这里的并行是指和trunk进行比较。比如:

  • 项目 Test3.0 开发完成。此时,生成一个tag(Test_tag_3.0),然后基于这个tag做release(Test_release_3.0);

  • Trunk进入 Test3.1 版本开发,但是发现 Test3.0 存在Bug。此时,就需要基于 Test_tag_3.0做一个branch,基于这个branch进行Bug修复;

  • 当Bug修复完成,则生成一个Tag(Test_tag_3.0.1),然后根据需要是否将Test_tag_3.0并入到Test3.1(Trunk)中去;

注意:

对于svn还要注意的一点,SVN的版本号是全局的,其实这个就是一个tag的标记,所以我们经常可以看到,什么release,基于xxx项目的2xxxx版本。就是这个意思了。但是,它还明确的给出一个tag的概念,就是因为这个更加的可读,毕竟记住tag_release_1_0要比记住一个很大的版本号容易的多。

实例二

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

常见需求

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

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

需求:产品开发已经基本完成,并且通过很严格的测试,这时候我们就想发布给客户使用,发布我们的1.0版本,这个和branches有什么区别,好像啥区别也没有?

是的,branches和tags是一样的,都是目录,只是我们不会对这个release-1.0的tag做修改了,不再提交了,如果提交那么就是branches

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

最灵繁的人也看不见自己的背脊。——非洲
1 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号