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

SVN是否可以复制并覆盖目标分支,或合并并保留源分支?,svn,merge,tags,Svn,Merge,Tags,我是SVN的新手。我发现,当您将分支A合并到分支B时,SVN会将分支A中的所有内容移动到分支B,而不是复制。当你把分支A复制到分支C,当你再次做同样的事情时,它会给你一个错误分支C已经存在 我想完成的是: 首先,我有一个分支/dev——用于开发 然后将branch/dev复制到branch/test——进行功能测试 然后将分支/测试复制到主干–用于阶段 然后开始生产 由于我无法覆盖现有分支,当我想再次复制分支/dev时,我需要先删除test,这很不方便 有办法吗?svn merge不会“移动

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

我想完成的是:

  • 首先,我有一个
    分支/dev
    ——用于开发
  • 然后将
    branch/dev
    复制到
    branch/test
    ——进行功能测试
  • 然后将
    分支/测试
    复制到
    主干
    –用于阶段
  • 然后开始生产
由于我无法覆盖现有分支,当我想再次复制
分支/dev
时,我需要先删除test,这很不方便


有办法吗?

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

$ cd my/working/copy
$ svn merge ^/branches/myfeaturebranch .
将把
^/branchs/myfeaturebranch
中的所有(未合并)更改合并到
my/working/copy
中。这将为您留下一个工作副本,其中包含您试图合并的
/branchs/myfeaturebranch
中的所有更改。此时,您可能还需要在提交之前解决冲突。(请注意,合并的最后一步只是提交一系列更改。)

另一方面,复制类似于
cp-r SRC-DST
,其中
SRC
DST
可以是本地文件系统路径或存储库URL。在执行从repo到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

希望这能把事情弄清楚一点。

如果你从
/a
复制到
/b
,当
/b
已经存在时,你会得到
/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更新
时,svn足够聪明,只下载更改的文件,而不是重新下载整个项目


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

我很好奇您的答案中的
^
指的是什么?当我在linux框中执行svn复制时,它会覆盖。但是,当我在eclipse中执行分支/标记时,它告诉我错误分支已经存在,这使我相信svn copy无法覆盖“^”扩展到当前工作副本的存储库URL,因此您可以跳过写入”svn://my.repo.com/path/to/my/repo“无处不在。
svn copy
不会覆盖目标,但是在
^/b
存在的地方执行
svn copy^/a^/b
^/a
复制到
^/a/b
。如果您想将
^/a
复制到
^/b
,可以。