我是SVN的新手。我发现当你将分支A合并到分支B时,SVN将分支A中的所有内容移动到B,而不是复制。当你将分支A复制到分支C时,当你再次做同样的事情时,它会给你一个错误分支C已经存在。
我想要完成的是:
branch/dev
- 用于开发branch/dev
复制到branch/test
- 进行功能测试branch/test
复制到trunk
- 用于舞台由于我无法覆盖现有分支,当我想再次复制branch/dev
时,我需要先删除测试,这很不方便。
有办法吗?
答案 0 :(得分:4)
svn merge
不会“移动所有内容”。实际上,“合并”和“复制”是Subversion中非常不同的操作。合并将采用分支中所做的更改并将其合并到工作副本中:
$ cd my/working/copy
$ svn merge ^/branches/myfeaturebranch .
将所有(未合并的)更改从^/branches/myfeaturebranch
合并到my/working/copy
。这将为您提供一个工作副本,其中包含您尝试合并的/branches/myfeaturebranch
的所有更改。此时,您可能还会遇到需要在提交之前解决的冲突。 (请注意,合并的最后行为只是提交了一系列更改。)
另一方面,复制与cp -r SRC DST
类似,其中SRC
和DST
可以是本地文件系统路径或存储库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足够智能,只能下载更改的文件,而不是重新下载整个项目。
这种方法的缺点是有一些时间,即使只有几秒钟,该分支不会存在,并且已经在该分支中的用户如果尝试更新将会收到错误