版本控制系统的一项功能是能够将更改隔离到单独的开发线上。这条线被称为分支。分支通常用于尝试新功能,而不会因编译错误和错误而干扰主开发线。一旦新功能足够稳定,开发分支就会合并回主分支(主干)。
版本控制系统的另一项功能是能够标记特定的修订版(例如发布版本),以便您可以随时重新创建某个构建或环境。此过程称为标记。
Subversion 没有专门用于分支或标记的命令,而是使用所谓的“廉价副本”。廉价副本类似于 Unix 中的硬链接,这意味着它不会在存储库中创建完整副本,而是创建指向特定树/修订版的内部链接。因此,分支和标签创建起来非常快,并且在存储库中几乎不占用额外空间。
如果您已使用推荐的目录结构导入项目,则创建分支或标签版本非常简单
在工作副本中选择要复制到分支或标签的文件夹,然后选择命令 → .
新分支的默认目标 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 版本复制。无需从您的工作副本传输数据,分支创建速度非常快。
新分支直接从仓库中复制,但您可以选择较旧的版本。如果您忘记在您上周发布项目时创建标签,这将很有用。如果您不记得版本号,请单击右侧的按钮以显示版本日志,然后从那里选择版本号。同样,不会从您的工作副本传输任何数据,分支创建速度非常快。
新分支是您本地工作副本的完全相同副本。如果您已将工作副本中的一些文件更新到较旧的版本,或者您已进行本地更改,那么这些更改将完全包含在副本中。当然,如果这些更改尚未存在于仓库中,这种类型的复杂标签可能需要将数据从您的工作副本传输回仓库。
如果您希望您的工作副本自动切换到新创建的分支,请使用 将工作副本切换到新分支/标签 复选框。但是,如果您这样做,请首先确保您的工作副本不包含修改。如果有,这些更改将在您切换时合并到分支工作副本中。
如果您的工作副本包含使用 svn:externals
属性包含的其他项目,这些外部项目将在分支/标签对话框的底部列出。对于每个外部项目,都会显示目标路径和源 URL。
如果您希望确保新标签始终处于一致状态,请检查所有外部项目以确保其版本固定。如果您不检查外部项目,而这些外部项目指向将来可能更改的 HEAD 版本,则签出新标签将签出外部项目的 HEAD 版本,您的标签可能无法再编译。因此,在创建标签时,始终将外部项目设置为显式版本是一个好主意。
外部项目会自动固定到当前 HEAD 版本或工作副本 BASE 版本,具体取决于分支/标签的来源。
如果一个作为外部包含的项目本身包含了外部,那么这些外部将不会被标记!只有直接子级外部可以被标记。
按 仓库内部 创建的。
将新副本提交到仓库。不要忘记提供日志信息。请注意,副本是在请注意,除非您选择将工作副本切换到新创建的分支,否则创建分支或标签 不会 影响您的工作副本。即使您从工作副本创建分支,这些更改也会提交到新分支,而不是主干,因此您的工作副本可能仍然标记为相对于主干已修改。
您也可以在没有工作副本的情况下创建分支或标签。为此,请打开仓库浏览器。您可以在那里将文件夹拖放到新位置。您必须按住 Ctrl 键拖动以创建副本,否则文件夹将被移动,而不是复制。
您也可以用鼠标右键拖动文件夹。释放鼠标按钮后,您可以从上下文菜单中选择是要移动还是复制文件夹。当然,要创建分支或标签,您必须复制文件夹,而不是移动它。
另一种方法是从日志对话框中进行。您可以显示例如主干的日志对话框,选择一个版本(最顶部的 HEAD 版本或更早的版本),右键单击并选择
。...这就是(实际上不是)问题。虽然签出将从仓库中的所需分支下载所有内容到您的工作目录,但
→ 只会将更改的数据传输到您的工作副本。这对网络负载和您的耐心都有好处。:-)要使用新生成的 分支 或 标签,您可以通过以下几种方式进行操作。
→ 在空文件夹中进行全新检出。您可以检出到本地磁盘上的任何位置,并且可以从您的仓库中创建任意数量的工作副本。
将当前工作副本切换到仓库中新创建的副本。再次选择项目的顶层文件夹,并使用上下文菜单中的
→ 。在下一个对话框中,输入您刚刚创建的分支的 URL。选择 头部修订版 单选按钮,然后单击 。您的工作副本将切换到新的分支/标签。
切换的工作原理与更新类似,它不会丢弃您的本地更改。您对工作副本所做的任何尚未提交的更改将在您进行切换时合并。如果您不希望发生这种情况,则必须在切换之前提交更改,或者将工作副本还原到已提交的修订版(通常是 HEAD)。
如果您想同时处理主干和分支,但不想进行全新检出,可以使用 Windows 资源管理器在另一个文件夹中复制主干检出,然后使用
→ 将该副本切换到您的新分支。
虽然 Subversion 本身没有区分标签和分支,但它们通常的使用方式略有不同。
标签通常用于在特定阶段创建项目的静态快照。因此,它们通常不用于开发 - 这就是分支的用途,这也是我们首先推荐 /trunk /branches /tags
仓库结构的原因。在标签修订版上工作 不是一个好主意,但由于您的本地文件没有写保护,因此没有什么可以阻止您错误地执行此操作。但是,如果您尝试提交到包含 /tags/
的仓库路径,TortoiseSVN 会警告您。
您可能需要对已经标记的版本进行进一步的更改。处理此问题的正确方法是首先从标签创建新的分支并提交分支。在此分支上进行更改,然后从这个新分支创建新的标签,例如 Version_1.0.1
。
如果您修改了从分支创建的工作副本并提交,则所有更改都将进入新的分支,而 不会 进入主干。只有修改会被存储。其余部分仍然是廉价的副本。