手册

分支/标签

版本控制系统的一项功能是能够将更改隔离到单独的开发线上。这条线被称为分支。分支通常用于尝试新功能,而不会因编译错误和错误而干扰主开发线。一旦新功能足够稳定,开发分支就会合并回主分支(主干)。

版本控制系统的另一项功能是能够标记特定的修订版(例如发布版本),以便您可以随时重新创建某个构建或环境。此过程称为标记

Subversion 没有专门用于分支或标记的命令,而是使用所谓的廉价副本。廉价副本类似于 Unix 中的硬链接,这意味着它不会在存储库中创建完整副本,而是创建指向特定树/修订版的内部链接。因此,分支和标签创建起来非常快,并且在存储库中几乎不占用额外空间。

创建分支或标签

如果您已使用推荐的目录结构导入项目,则创建分支或标签版本非常简单

图 4.54. 分支/标签对话框

The Branch/Tag Dialog


在工作副本中选择要复制到分支或标签的文件夹,然后选择命令TortoiseSVN分支/标签....

新分支的默认目标 URL 将是工作副本所基于的源 URL。您需要将该 URL 编辑为分支/标签的新路径。因此,而不是

https://svn.example.com/repos/ProjectName/trunk
      

您现在可以使用类似以下内容:

https://svn.example.com/repos/ProjectName/tags/Release_1.10
      

如果您不记得上次使用的命名约定,请单击右侧的按钮打开存储库浏览器,以便您可以查看现有的存储库结构。

中间文件夹

当您指定目标 URL 时,所有直到最后一个文件夹都必须已经存在,否则您将收到错误消息。在上面的示例中,URL https://svn.example.com/repos/ProjectName/tags/ 必须存在才能创建 Release_1.10 标签。

但是,如果您想将分支/标签创建到尚未存在的中间文件夹的 URL,则可以在对话框底部选中 创建中间文件夹 选项。如果该选项被激活,所有中间文件夹将自动创建。

请注意,此选项默认情况下处于禁用状态,以避免拼写错误。例如,如果您将目标 URL 键入为 https://svn.example.com/repos/ProjectName/Tags/Release_1.10 而不是 https://svn.example.com/repos/ProjectName/tags/Release_1.10,则在选项禁用时会收到错误,但在选项启用时,将自动创建一个名为 Tags 的文件夹,最终您将拥有一个名为 Tags 的文件夹和一个名为 tags 的文件夹。

现在您需要选择复制的来源。您有三个选项:

仓库中的 HEAD 版本

新分支直接从仓库中的 HEAD 版本复制。无需从您的工作副本传输数据,分支创建速度非常快。

仓库中的特定版本

新分支直接从仓库中复制,但您可以选择较旧的版本。如果您忘记在您上周发布项目时创建标签,这将很有用。如果您不记得版本号,请单击右侧的按钮以显示版本日志,然后从那里选择版本号。同样,不会从您的工作副本传输任何数据,分支创建速度非常快。

工作副本

新分支是您本地工作副本的完全相同副本。如果您已将工作副本中的一些文件更新到较旧的版本,或者您已进行本地更改,那么这些更改将完全包含在副本中。当然,如果这些更改尚未存在于仓库中,这种类型的复杂标签可能需要将数据从您的工作副本传输回仓库。

如果您希望您的工作副本自动切换到新创建的分支,请使用 将工作副本切换到新分支/标签 复选框。但是,如果您这样做,请首先确保您的工作副本不包含修改。如果有,这些更改将在您切换时合并到分支工作副本中。

如果您的工作副本包含使用 svn:externals 属性包含的其他项目,这些外部项目将在分支/标签对话框的底部列出。对于每个外部项目,都会显示目标路径和源 URL。

如果您希望确保新标签始终处于一致状态,请检查所有外部项目以确保其版本固定。如果您不检查外部项目,而这些外部项目指向将来可能更改的 HEAD 版本,则签出新标签将签出外部项目的 HEAD 版本,您的标签可能无法再编译。因此,在创建标签时,始终将外部项目设置为显式版本是一个好主意。

外部项目会自动固定到当前 HEAD 版本或工作副本 BASE 版本,具体取决于分支/标签的来源。

表 4.1. 固定版本

复制源固定版本
仓库中的 HEAD 版本外部仓库 HEAD 版本
仓库中的特定版本外部仓库 HEAD 版本
工作副本外部工作副本 BASE 版本


外部中的外部

如果一个作为外部包含的项目本身包含了外部,那么这些外部将不会被标记!只有直接子级外部可以被标记。

确定 将新副本提交到仓库。不要忘记提供日志信息。请注意,副本是在 仓库内部 创建的。

请注意,除非您选择将工作副本切换到新创建的分支,否则创建分支或标签 不会 影响您的工作副本。即使您从工作副本创建分支,这些更改也会提交到新分支,而不是主干,因此您的工作副本可能仍然标记为相对于主干已修改。

创建分支或标签的其他方法

您也可以在没有工作副本的情况下创建分支或标签。为此,请打开仓库浏览器。您可以在那里将文件夹拖放到新位置。您必须按住 Ctrl 键拖动以创建副本,否则文件夹将被移动,而不是复制。

您也可以用鼠标右键拖动文件夹。释放鼠标按钮后,您可以从上下文菜单中选择是要移动还是复制文件夹。当然,要创建分支或标签,您必须复制文件夹,而不是移动它。

另一种方法是从日志对话框中进行。您可以显示例如主干的日志对话框,选择一个版本(最顶部的 HEAD 版本或更早的版本),右键单击并选择 从版本创建分支/标签...

签出还是切换...

...这就是(实际上不是)问题。虽然签出将从仓库中的所需分支下载所有内容到您的工作目录,但 TortoiseSVN切换... 只会将更改的数据传输到您的工作副本。这对网络负载和您的耐心都有好处。:-)

要使用新生成的 分支 或 标签,您可以通过以下几种方式进行操作。

  • TortoiseSVN检出 在空文件夹中进行全新检出。您可以检出到本地磁盘上的任何位置,并且可以从您的仓库中创建任意数量的工作副本。

  • 将当前工作副本切换到仓库中新创建的副本。再次选择项目的顶层文件夹,并使用上下文菜单中的 TortoiseSVN切换...

    在下一个对话框中,输入您刚刚创建的分支的 URL。选择 头部修订版 单选按钮,然后单击 确定。您的工作副本将切换到新的分支/标签。

    切换的工作原理与更新类似,它不会丢弃您的本地更改。您对工作副本所做的任何尚未提交的更改将在您进行切换时合并。如果您不希望发生这种情况,则必须在切换之前提交更改,或者将工作副本还原到已提交的修订版(通常是 HEAD)。

  • 如果您想同时处理主干和分支,但不想进行全新检出,可以使用 Windows 资源管理器在另一个文件夹中复制主干检出,然后使用 TortoiseSVN切换... 将该副本切换到您的新分支。

图 4.55. 切换对话框

The Switch Dialog


虽然 Subversion 本身没有区分标签和分支,但它们通常的使用方式略有不同。

  • 标签通常用于在特定阶段创建项目的静态快照。因此,它们通常不用于开发 - 这就是分支的用途,这也是我们首先推荐 /trunk /branches /tags 仓库结构的原因。在标签修订版上工作 不是一个好主意,但由于您的本地文件没有写保护,因此没有什么可以阻止您错误地执行此操作。但是,如果您尝试提交到包含 /tags/ 的仓库路径,TortoiseSVN 会警告您。

  • 您可能需要对已经标记的版本进行进一步的更改。处理此问题的正确方法是首先从标签创建新的分支并提交分支。在此分支上进行更改,然后从这个新分支创建新的标签,例如 Version_1.0.1

  • 如果您修改了从分支创建的工作副本并提交,则所有更改都将进入新的分支,而 不会 进入主干。只有修改会被存储。其余部分仍然是廉价的副本。

TortoiseSVN 主页