The svn switch command transforms an existing working
copy to reflect a different branch. While this command isn't strictly
necessary for working with branches, it provides a nice shortcut. In our
earlier example, after creating your private branch, you checked out a fresh
working copy of the new repository directory. Instead, you can simply ask
Subversion to change your working copy of /calc/trunk
to mirror the new branch location:
$ 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
“Switching” a working copy that has no local modifications to a different branch results in the working copy looking just as it would if you'd done a fresh checkout of the directory. It's usually more efficient to use this command, because often branches differ by only a small degree. The server sends only the minimal set of changes necessary to make your working copy reflect the branch directory.
svn
switch命令也可以带--revision
(-r
)参数,所以你不需要一直移动你的工作副本到分支的HEAD
。
Of course, most projects are more complicated than our
calc
example, and contain multiple subdirectories.
Subversion users often follow a specific algorithm when using branches:
拷贝整个项目的“trunk”目录到一个新的分支目录。
只是转换工作副本的部分目录到分支。
In other words, if a user knows that the branch work needs to happen on only a specific subdirectory, she uses svn switch to move only that subdirectory to the branch. (Or sometimes users will switch just a single working file to the branch!) That way, the user can continue to receive normal “trunk” updates to most of her working copy, but the switched portions will remain immune (unless someone commits a change to her branch). This feature adds a whole new dimension to the concept of a “mixed working copy”—not only can working copies contain a mixture of working revisions, but they can also contain a mixture of repository locations as well.
If your working copy contains a number of switched subtrees from different repository locations, it continues to function as normal. When you update, you'll receive patches to each subtree as appropriate. When you commit, your local changes will still be applied as a single, atomic change to the repository.
Note that while it's okay for your working copy to reflect a mixture of repository locations, these locations must all be within the same repository. Subversion repositories aren't yet able to communicate with one another; that feature is planned for the future.[28]
因为svn switch是svn update的一个变种,具有相同的行为,当新的数据到达时,任何工作副本的已经完成的本地修改会被保存。
提示 | |
---|---|
你是否发现你做出了复杂的修改(在 $ 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. The svn switch command, like svn update, preserves your local edits. At this point, your working copy is now a reflection of the newly created branch, and your next svn commit invocation will send your changes there. |
[28] You can, however, use svn switch
with the --relocate
option if the URL of your server
changes and you don't want to abandon an existing working copy. See svn switch (sw) for more information and an example.