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