我目前正在尝试将一些分支的更改合并到主干中,分支中的更改会将主干中每个项目的名称分开。所以为了简单起见,我们可以说干线的根部看起来像这样......
company-name-services
company-name-security
company-name-web
并且分支看起来像......
services
security
web
以下命令在分支中运行,以使其进入当前状态...
svn mv company-name-services services
svn mv company-name-security security
svn mv company-name-web web
以下代码在分支和主干中都发生了变化。现在我正在执行合并,在我的干线工作副本中,我使用Tortoise SVN合并选择“重新整合分支”作为合并类型,并选择分支路径作为“从URL”运行的结果我现在在我的工作副本中......
company-name-services
company-name-security
company-name-web
services
security
web
文件夹company-name- *标记为删除,其他债券文件夹标记为添加。问题在于债券项目文件夹中的所有文件都没有与它们相关联的历史信息,并且在中继文件夹中不存在更糟糕的更改。我认为SVN足够聪明,可以在合并后从trunk中引入更改并保留历史记录,因为文件夹是使用svn命令行工具重命名的。我得到的结果是预期的还是我应该采取其他方式进行合并?
答案 0 :(得分:1)
要理解为什么会发生这种情况,你必须了解svn如何合并。
当您将分支合并回主干时,实际上将分支中完成的每个更改合并到主干中。合并时,svn将从您的分支中获取每个提交,并逐个对您的主干执行相同的更改。
由于第一次更改,可能是您对分支执行的第一次提交是重命名根目录,svn将在trunk上执行相同的操作。
我相信您可以通过手动将分支中的每个子文件夹合并到主干中相应的子文件夹来解决此问题。我不知道Tortois命令,但命令行将是这样的(假设你从trunk中的根文件夹开始):
> cd company-name-services
> svn merge -r <insert first revision after rename>:HEAD <insert url to sub-folder in branch> .
每个子文件夹的等等
答案 1 :(得分:1)
svn mv
是创建分支的错误方法;这是一个举动。您应该使用svn cp
,它将主干的副本放入分支。或者,您也应该先使用TortoiseSVN创建分支,然后再次使用它来进行合并。
你所做的是将树干移动到树枝上,在树枝上工作,然后将树枝移回树干。没有单独的历史可供维护。
请参阅SVN book,特别是Chapter 4, Branching and Merging
,子标题Creating a Branch
。
答案 2 :(得分:0)
在答案中回复的道歉我还没有要求的评论。
@Ken我可能还没有在我的帖子中说清楚,我没有使用svn mv
创建分支我用Tortoise分支发出命令,我相信这相当于这样的东西......
svn cp http://my.server/repos/myRepo/trunk \
http://my.server/repos/myRepo/branches/my-branch
在命令行上,然后从分支内部发出svn mv
命令,重命名存储库根目录中的文件夹。
@sstendal当我早上上班并回复结果时,我会尝试你的建议。