本文档旨在描述 Apache™ Subversion® 的 1.7.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””更新,但切换的部分将保持不受影响(除非有人提交了对她的分支的更改)。此功能为““混合工作副本””的概念增加了新的维度——工作副本不仅可以包含工作修订版的混合,还可以包含存储库位置的混合。

[Tip] 提示

通常,切换的子目录与切换““离开””的位置具有共同的祖先。但是 svn switch 可以将子目录切换以镜像与之没有共同祖先的存储库位置。为此,您需要使用 --ignore-ancestry 选项。

如果您的工作副本包含来自不同存储库位置的多个切换的子树,它将继续正常运行。当您更新时,您将收到针对每个子树的适当补丁。当您提交时,您的本地更改仍然会作为对存储库的单个原子更改应用。

请注意,虽然您的工作副本可以反映存储库位置的混合,但这些位置必须都在同一个存储库中。Subversion 存储库目前还无法相互通信;该功能计划在未来实现。[34]

[Tip] 提示

需要更改通过 HTTP 访问的存储库的 URL 的管理员建议在他们的 httpd.conf 配置文件中添加一个从旧 URL 位置到新 URL 位置的永久重定向(通过 RedirectPermanent 指令)。Subversion 客户端通常会在用户尝试使用仍然反映旧 URL 位置的工作副本时生成的错误消息中显示新的存储库 URL。事实上,Subversion 1.7 客户端会更进一步,自动将工作副本重新定位到新的 URL。

因为 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 switch 命令与 svn update 一样,会保留你的本地编辑。此时,你的工作副本现在反映了新创建的分支,你接下来的 svn commit 调用将把你的更改发送到那里。



[34] 但是,如果你服务器的 URL 发生变化,并且你不想放弃现有的工作副本,你可以使用 svn relocate。有关更多信息和示例,请参阅 svn relocate,位于 第 9 章,Subversion 完整参考 中。