本手册描述了 Subversion 1.2。如果您使用的是更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的手册。

切换工作副本

命令 svn switch 将现有的工作副本转换为不同的分支。虽然此命令对于处理分支不是严格必需的,但它为用户提供了一种快捷方式。在我们之前的示例中,在创建私有分支后,您检出了新仓库目录的全新工作副本。相反,您只需要求 Subversion 将您对 /calc/trunk 的工作副本更改为镜像新分支位置。

$ cd calc

$ svn info | grep URL
URL: http://svn.example.com/repos/calc/trunk

$ svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
U   integer.c
U   button.c
U   Makefile
Updated to revision 341.

$ svn info | grep URL
URL: http://svn.example.com/repos/calc/branches/my-calc-branch

在“切换”到分支后,您的工作副本与您从新检出目录获得的工作副本没有什么不同。并且使用此命令通常更有效率,因为分支通常只有很小的差异。服务器仅发送使您的工作副本反映分支目录所需的最小更改集。

命令 svn switch 还接受 --revision (-r) 选项,因此您不必总是将工作副本移动到分支的“顶端”。

当然,大多数项目比我们的 calc 示例更复杂,包含多个子目录。Subversion 用户在使用分支时通常遵循特定的算法。

  1. 将项目的整个“trunk”复制到新的分支目录。

  2. 仅切换 trunk 工作副本的 部分 以镜像分支。

换句话说,如果用户知道分支工作只需要在特定子目录上进行,他们可以使用 svn switch 将仅该子目录移动到分支。(或者有时用户会将单个工作文件切换到分支!)这样,他们可以继续接收大多数工作副本的正常“trunk”更新,但切换的部分将保持不受影响(除非有人提交了对他们分支的更改)。此功能为“混合工作副本”的概念添加了全新的维度——工作副本不仅可以包含工作修订版本的混合,还可以包含仓库位置的混合。

如果您的工作副本包含来自不同仓库位置的多个切换的子树,它将继续正常运行。当您更新时,您将根据需要收到每个子树的补丁。当您提交时,您的本地更改仍将作为一个单一的原子更改应用于仓库。

请注意,虽然您的工作副本反映仓库位置的混合是正常的,但这些位置必须全部位于 同一个 仓库中。Subversion 仓库目前还无法相互通信;这是一个在 Subversion 1.0 之后计划的功能。[12]

因为 svn switch 本质上是 svn update 的变体,它具有相同的行为;当从仓库接收新数据时,您的工作副本中的任何本地修改都会被保留。这使您可以执行各种巧妙的操作。

例如,假设您有一个 /calc/trunk 的工作副本,并对其进行了一些更改。然后您突然意识到您是想对分支而不是主干进行更改。没问题!当您将工作副本 svn switch 到分支时,本地更改将保留。然后您可以测试并将它们提交到分支。



[12] 但是,如果您要更改服务器的 URL,并且不想放弃现有工作副本,则可以使用 svn switch--relocate 选项。有关更多信息和示例,请参阅 第 9 章,Subversion 完整参考 中的 svn switch 部分。