本手册是针对 Subversion 1.1 版本编写的。如果您使用的是更新版本的 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 用户在使用分支时通常遵循特定的算法
将项目的整个“主干”复制到新的分支目录。
仅将主干工作副本的一部分切换以镜像分支。
换句话说,如果用户知道分支工作只需要在特定子目录上进行,他们可以使用 svn switch 将仅该子目录移动到分支。(或者,有时用户会将单个工作文件切换到分支!)这样,他们就可以继续接收对其工作副本的大部分内容进行正常的“主干”更新,但切换的部分将保持不受影响(除非有人向他们的分支提交了更改)。此功能为“混合工作副本”的概念添加了一个全新的维度,不仅工作副本可以包含混合的工作修订版本,还可以包含混合的仓库位置。
如果您的工作副本包含来自不同仓库位置的多个切换的子树,它将继续正常工作。当您更新时,您将根据需要接收每个子树的补丁。当您提交时,您的本地更改将仍然作为对仓库的单个原子更改应用。
请注意,虽然您的工作副本可以反映混合的仓库位置,但这些位置必须都在同一个仓库中。Subversion 仓库目前无法互相通信;这是一个在 Subversion 1.0 之后计划的功能。[11]
由于 svn switch 本质上是 svn update 的一个变体,因此它具有相同的行为;当从仓库接收到新数据时,您的工作副本中的任何本地修改都将保留。这允许您执行各种巧妙的技巧。
例如,假设您有一个/calc/trunk的工作副本,并对其进行了若干更改。然后您突然意识到,您是想对分支进行更改,而不是主干。没问题!当您将工作副本 svn switch 到分支时,本地更改将保留。然后,您可以测试并将其提交到分支。
[11] 但是,如果您的服务器的 URL 发生更改,并且您不想放弃现有工作副本,则可以使用 svn switch 的--relocate选项。有关更多信息和示例,请参见 第 9 章,Subversion 完整参考 中的 svn switch 部分。