切换工作副本

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用户 在使用分支时通常遵循一个特定的算法。

  1. 复制项目的整个“主线”到一个新的分支目录。

  2. 仅切换主线的一部分来反映分支。

换句话说,如果你个用户知道那个分支的工作仅需要在一个特定的子目录里发生,他们使用svn switch 来仅把这个子目录转换到那个分支。(有时候,用户仅仅切换单独的一个文件到分支!)这种方式,他们能继续在他们工作副本的 绝大部分上接受日常的“主线”更新,但切换了的部分将仍然不受影响(如果没有人再他们的分支上提交修改的话)。 这个特性给“混合工作副本”这个概念增加了全新的维度——工作副本不仅能包含修订版的混合,而且也能包含不同资料库 位置的混合。

如果你的工作副本包含大量切换到不同资料库位置的子树,它继续像通常那样工作。 当你更新时,你将接受到每个子树的适当的补丁。当你提交时,你的本地修改也将作为一个单独的原子的修改应用到资料库。

注意,虽然你的工作副本反映资料库位置的混合没有问题,但这些位置必须都在相同的资料库内。 Subversion资料库还不能互相通信;这个特性超出了Subversion 1.0的计划。 [10]

因为svn switch本质上是svn update的一个变形,它们有相同的行为; 当资料库中的新数据到来时,你工作副本中任何的本地修改都会被保留。这使你可以实行各种的聪明技巧。

例如,假设你有个/calc/trunk的工作副本并对它作了大量的修改。那么你突然察觉到你应该在另一分支上作这些 修改。没问题!当你 svn switch 你的工作副本到那个分支时,本地修改会保留。你可以接着测试并提交它们到那个分支。



[10] 然而,如果你服务器的URL改变了而你不想丢弃现有的工作副本,你可以svn switch 加上--relocate选项。参看???中关于svn switch这节获取更多信息和例子。