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