本文字档正在编写中——内容可能随时变更——并且可能无法准确描述 Apache™ Subversion® 软件的任何已发布版本。将此页面加入书签或以其他方式推荐给其他人可能不是一个明智的做法。请访问 https://svnbooks.subversion.org.cn/ 以获取此书籍的稳定版本。

遍历分支

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

$ cd calc
$ svn info | grep URL
URL: http://svn.example.com/repos/calc/trunk
Relative URL: ^/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
Relative URL: ^/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 存储库尚无法相互通信;该功能计划在未来实现。 [43]

[Tip] 提示

需要更改通过 HTTP 访问的存储库的 URL 的管理员鼓励将永久重定向从旧 URL 位置添加到新的 URL 位置(通过 RedirectPermanent 指令)添加到他们的 httpd.conf 配置文件中。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 调用将把您的更改发送到那里。



[43] 但是,如果您服务器的 URL 发生变化,并且您不想放弃现有工作副本,您可以使用 svn relocate。有关更多信息和示例,请参见 svn relocate,位于 svn Reference—Subversion Command-Line Client 中。

TortoiseSVN 官方中文版 1.14.7 发布