5.16. 分支/标记

版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上。这条线被称为分支。分支经常被用来试验新的特性,而不会对开发有编译错误的干扰。当新的特性足够稳定之后,开发品的分支就可以混合回主分支里(主干线).

版本控制系统的另一个特性是能够标记特殊的版本(例如某个发布版本),所以你可以在任何时候重新建立一个特定的构件和环境。这个过程被称作标记

Subversion 没有用于建立分支和标记的特殊命令,但是使用所谓的便宜复制来代替。便宜复制类似于Unix里的硬连接,它意思是代替一个版本库里的完整的复制,创建一个内部的连接,指向一个具体的版本树。结果分支和标记就迅速被创建,并且没有在版本库里占据任何额外的空间。

5.16.1. 创建一个分支或标记

如果你用推荐的目录结构导入了一个工程,那么创建分支或标记就非常简单:

图 5.30. 分支/标记对话框

分支/标记对话框

在你当前的工作副本中给你你想要复制的分支或标记选择一个目录,然后选择命令TortoiseSVN分支/标记...

默认的目标URL将会是你当前工作副本所处的源URL。你必须给你的分支/标记编辑一个新路径。来取代

    http://svn.collab.net/repos/ProjectName/trunk

你可以使用这样的设置

    http://svn.collab.net/repos/ProjectName/tags/Release_1.10

如果你忘记了你上一次使用的命名约定,可以用鼠标右键打开版本库浏览器来察看已经存在的版本库结构。

现在你必须选择要复制的源位置。在这里你有三个设置选项:

版本库中的最新版本

新分支直接从仓库中的最新版本里复制出来。不需要从你的工作副本中传输任何数据,这个分支的建立是非常快的。

在版本库中指定具体的版本

在仓库中直接复制建立一个新分支同时你也可以选择一个旧版本。假如在你上周发布了项目时忘记了做标记,这将非常有用。如果你记不起来版本号,通过点击鼠标右键来显示版本日志,同时从这里选取版本号。和上次一样不需要从你的工作副本中传输任何数据,这个分支建立起来是非常快的。

工作副本

新的分支是一个完全等同于你的本地工作副本的一个副本。如果你更新了一些文件到你的工作副本的某个旧版本里,或者你在本地做出了修改,这些改变将准确无误的进入副本中。自然而然地这种综合的标记会包含正在从工作副本传输到版本库的数据,如果这些数据还不存在的话。

如果你想把你的工作副本自动切换到最新创建的分支,使用转换工作副本至新分支/标记 选择框.但是如果你打算这么做,首先要确认你的工作副本没有被修改。如果有修改的话,当你转换后这些修改将会混合进你的工作副本分支里。

按下确认提交新副本到版本库中。别忘了提供一条日志信息。需要注意的是这个副本是在版本库内部创建的。

需要注意建立一个分支或标记不会影响你的工作副本。即使你复制了你的工作副本,这些修改也会提交到新分支里,而不是到主干里,所以你的工作副本可能仍然标记为已修改状态。

5.16.2. 检出或者切换

...这是个小问题。当你想从预期的分支检出所有数据到你的工作副本目录时TortoiseSVN切换... 仅仅传输已经被修改的数据到你的工作副本中。这样能减轻你的网络负担,也能减少你的耐心。

为了能够使用你最新产生的副本你有采用下面几种方法。你可以:

  • TortoiseSVN检出一个最新的项目在一个空目录下。你可以在你的本地磁盘上的任意位置进行检出操作,同时你可以从版本库中按照你的意愿建立出任意数量的副本。

  • 在版本库中从你当前的工作副本切换到最新建立的副本。再一次选择你的项目所处的顶级文件夹然后在菜单中使用TortoiseSVN切换...

    在接下来的对话框中蠕蠕你刚才建立的分支的URL。选择最新版本单选按钮然后确认。你的工作副本就切换到了最新的分支/标记。

    切换操作起来就象更新,因为它没有丢弃你在本地做的修改。在工作副本里当你进行切换的时候任何没有提交过的修改都会被混合。如果你不想看到这样的结果,那么你可以有两种选择,要么在切换前提交修改,要么把工作副本恢复到一个已经提交过的版本(比如最新版本)。

图 5.31. 切换对话框

切换对话框

尽管Subversion本身不区分标记和分支,它们的使用方法还是有些不同。

  • 在某个特殊的阶段标记被用来建立一个项目的静态映像。同样地标记和分支应该被独特地应用于开发品。这就是我们首选推荐 /trunk /branches /tags这样的版本库结构的原因。使用标记的版本并不是一个好想法,因为你的本地文件没有写保护,你这样做容易犯错误。不管怎样如果你试着提交(修改)到一个包含/标记/的版本库路径下,TortoiseSVN 会给你警告。

  • 如果你想要在一个已经标记的发布版上做更多的修改。正确的操作方法是先从标记处建立一个新分支然后提交这个分支。在这个分支的基础上进行修改后再从这个新分支上建立一个新标记,例如 Version_1.0.1

  • 如果你修改了一个从分支建立的工作副本然后又提交了这个副本,那么所有的修改会转到一个新分支里而不是 主干。仅仅是存储了修改的数据。其余的数据还是便宜复制。