本手册描述的是 Subversion 1.6.x 系列。如果您运行的是其他版本的 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 ^/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 用户在使用分支时通常遵循特定算法。

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

  2. 仅将 部分 trunk 工作副本切换为反映分支。

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

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

请注意,虽然工作副本可以反映混合的仓库位置,但这些位置必须全部位于 相同 的仓库中。Subversion 仓库目前无法相互通信;该功能计划在未来实现。[28]

由于 svn switch 本质上是 svn update 的变体,它也具有相同的行为;当从仓库接收新数据时,工作副本中的任何本地修改都将保留。

[Tip] 提示

您是否曾经发现自己在进行一些复杂的编辑(在您的 /trunk 工作副本中),然后突然意识到 嘿,这些更改应该放在自己的分支中吗? 使用以下两个步骤即可总结此方法。

$ svn copy http://svn.example.com/repos/calc/trunk \
           http://svn.example.com/repos/calc/branches/newbranch \
      -m "Create branch 'newbranch'."
Committed revision 353.
$ svn switch ^/calc/branches/newbranch
At revision 353.

命令 svn switchsvn update 一样,会保留您的本地编辑。此时,您的工作副本已成为新创建分支的反映,您下次调用 svn commit 时,您的更改将被发送到该分支。



[28] 但是,如果您服务器的 URL 发生了更改并且您不想放弃现有工作副本,则可以使用 svn switch--relocate 选项。有关详细信息和示例,请参见 svn switch (sw)