SVN可以复制并覆盖目标分支或合并并保留源分支吗?

时间:2011-04-12 16:41:39

标签: svn merge tags

我是SVN的新手。我发现当你将分支A合并到分支B时,SVN将分支A中的所有内容移动到B,而不是复制。当你将分支A复制到分支C时,当你再次做同样的事情时,它会给你一个错误分支C已经存在。

我想要完成的是:

  • 首先我有一个branch/dev - 用于开发
  • 然后将branch/dev复制到branch/test - 进行功能测试
  • 然后将branch/test复制到trunk - 用于舞台
  • 然后标记为生产。

由于我无法覆盖现有分支,当我想再次复制branch/dev时,我需要先删除测试,这很不方便。

有办法吗?

2 个答案:

答案 0 :(得分:4)

svn merge不会“移动所有内容”。实际上,“合并”和“复制”是Subversion中非常不同的操作。合并将采用分支中所做的更改并将其合并到工作副本中:

$ cd my/working/copy
$ svn merge ^/branches/myfeaturebranch .

将所有(未合并的)更改从^/branches/myfeaturebranch合并到my/working/copy。这将为您提供一个工作副本,其中包含您尝试合并的/branches/myfeaturebranch的所有更改。此时,您可能还会遇到需要在提交之前解决的冲突。 (请注意,合并的最后行为只是提交了一系列更改。)

另一方面,复制与cp -r SRC DST类似,其中SRCDST可以是本地文件系统路径或存储库URL。在执行repo-to-repo副本时,Subversion会将所有更改从SRC复制(不合并)到DST。例如:

$ svn copy ^/trunk ^/tags/1.0.0

这会将当前中继复制(或“标记”)到^/tags/1.0.0。如果目的地已经存在,Subversion将拒绝覆盖它。

所以,你想做的事情可能就像

$ svn copy ^/trunk ^/branches/dev # create dev branch from trunk
$ svn co ^/branches/dev # checkout dev branch
$ cd dev
$ .... hack away ....
$ svn commit .... # commit your development changes
$ svn copy ^/branches/dev/ ^/branches/test # create testing branch
$ svn switch ^/branches/test # switch to testing branch
$ .... perform tests ....
$ svn commit .... # commit your changes in the testing branch
$ svn switch ^/trunk # switch back to trunk
$ svn merge ^/branches/test . # merge testing changes into working copy for trunk
$ .... resolve any conflicts ....
$ svn commit .... # commit merge
$ svn copy ^/trunk ^/tags/1.0.0 # final production tag

希望这会使事情稍微改善。

答案 1 :(得分:4)

如果您从endpoints复制到/a,当/b已存在时,您最终会得到/b

如果你想要相当于copy-with-overwrite,你将不得不做一个删除然后复制,如下所示:

/a/b

当测试分支中的用户执行svn delete https://myserver/myrepo/branch/test -m "Removing test prior to copy" svn copy https://myserver/myrepo/branch/dev -r HEAD https://myserver/myrepo/branch/test --parents -m "Copying dev branch to test" 时, svn足够智能,只能下载更改的文件,而不是重新下载整个项目。

这种方法的缺点是有一些时间,即使只有几秒钟,该分支不会存在,并且已经在该分支中的用户如果尝试更新将会收到错误