我创建了一个功能分支,因为我需要重构一个相当大的项目。功能分支是70%移动的东西和20%修改代码和10%新代码。它看起来像这样。
Trunk Branch Actions
2000 = 2001 create branch
| 2002 move lots of file and directories plus a few file edits
| 2003 lots of edits plus a few more file moves
2004 | a few edits to files that have been moved in the branch
| 2005 some more edits and a new file or two
2006 | a few edits to files that have been moved in the branch
| 2007 feature is done... time to pull changes from the trunk
当我尝试将更改从主干拉到分支时,我看到了#34树冲突"错误而不是其他。这是我发现的时候,我跟踪了一个在分支中移动并在主干中修改过的文件。
\old\path\file.txt - trunk version 2006
\new-path\file.txt - branch version 2007
---- I would like ----
\new-path\file.txt - merged trunk version 2006 and branch version 2007
我正在使用SVN 1.7和最新的TortoiseSVN客户端,所以我认为这些更改会被自动跟踪,这不会发生......我想我错了。我的第一个想法是使用命令行创建另一个分支然后逐个合并变更集,直到我再次使一切工作,但我不确定使用哪个参数来执行此操作。我觉得承诺2002完全破坏了我的祖先/历史,但我不确定。
有关如何解决此问题的任何建议?
答案 0 :(得分:2)
我认为这些变化会被自动跟踪,但这不会发生......
不,在合并的两侧重命名+编辑即使在1.8+中也会给你树冲突(合并略有改进,与1.7相反)
以为是使用命令行创建另一个分支,然后逐个合并变更集
错误的想法。因为您知道树冲突的两个来源,所以您强制将\old\path\file.txt
合并到\new-path\file.txt
,并且仅在此合并集之后合并树\old\path\
和\new-path\
- 没有树冲突
PS - 为了避免Subversion中的“Refactoring Hell”我总是建议单独重构refactor + merge(在SCM中合并为一等公民)并且在成功合并后只需用Mercurial工作目录的内容替换WC(你可以克隆SVN-repos,但无法推送合并集)