【问题标题】:Can SVN copy and override the target branch or merge and keep the source branch?SVN可以复制并覆盖目标分支或合并并保留源分支吗?
【发布时间】:2011-08-04 01:39:16
【问题描述】:

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

我想要完成的是:

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

由于无法覆盖已有的分支,当我想再次复制branch/dev时,需要先删除test,不方便。

有办法吗?

【问题讨论】:

    标签: svn merge tags


    【解决方案1】:

    如果你从/a复制到/b,当/b已经存在时,你最终得到/b/a

    如果您想要复制与覆盖的等价物,则必须先删除,然后再复制,如下所示:

    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 update 时,svn 足够聪明,只下载更改的文件,而不是重新下载整个项目。

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

    【讨论】:

      【解决方案2】:

      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 将复制(不合并)所有SRCDST 的更改。例如:

      $ 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
      

      希望这能稍微解决问题。

      【讨论】:

      • 我很好奇您回答中的^ 指的是什么?
      • 当我在 linux 机器中进行 svn 复制时,它会被覆盖。但是当我在eclipse中做分支/标记时,它告诉我错误分支已经存在,这让我相信svn副本不能被覆盖
      • "^" 扩展为当前工作副本的存储库 URL,因此您可以跳过在任何地方编写“svn://my.repo.com/path/to/my/repo”。跨度>
      • svn copy 不会覆盖目标,但在 ^/b 存在(并且是目录)的地方执行 svn copy ^/a ^/b 会将 ^/a 复制到 ^/a/b
      • 是的,如果你想将^/a复制到^/b
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多