需要有关使用分支和合并回主干的帮助/建议

时间:2011-06-17 05:01:47

标签: svn version-control merge branch vendor-branch

我的问题是,在按照以下程序进行合并时,在最佳实践场景中,“将分支折回主干”的最后一步是执行此操作的正确方法吗?

我已经使用svn很多年了。在我的个人项目中,我总是在没有第二思想的情况下愉快地在行李箱上劈开,并且以单线性线性方式进行版本控制已经接近完美了很长时间。简单高效。一切都很幸福,直到我想要更多地控制第三方库

今天,我正处于一个项目中,我觉得已经超越了hack-straight-from-trunk方法。我有多个第三方库,其中一些每周更换一次,我真的需要更多控制内容。我需要能够查看第三方lib版本之间的特定更改集,并跟踪我对特定库所做的更改。我已经看过几次代码库变得非常混乱,并且难以与缺乏经验的构建主管恢复可行状态,我无法承担时间错误。

所以我查看了供应商分支,在这里和那里阅读了一些文章。我有很棒的'版本控制与颠覆'一书,但我看到的例子有时与他们的方法相矛盾,我想理解'分支'。我正要跟随approach given on this post by Evan Weaver

我列出了下面的程序,我关注的是最后一节“将树枝折叠成树干”。似乎我过去合作过的构建主管通常会将分支变更集合到主干上,我认为分支甚至都没有被删除。这是一种正确的方法吗?

创建分支

1 - 注意当前的头版修订:

    svn info svn://server.com/svn/repository/trunk | grep Revision

2 - 将干净的远程干线副本放入branches文件夹。给它起个名字。我们将其称为your_branch,将HEAD_REVISION替换为您在步骤1中记下的修订号。:

svn cp svn://server.com/svn/repository/trunk \
svn://server.com/svn/repository/branches/your_branch \
-m "Branching from trunk to your_branch at HEAD_REVISION"

3 - 将本地结帐切换为指向新分支(这不会覆盖您的更改):

 svn switch --relocate \
 svn://server.com/svn/repository/trunk \
 svn://server.com/svn/repository/branches/your_branch

4 - 检查您的本地结帐是否现在肯定是your_branch,并且您可以更新确定:

svn info | grep URL
svn up

5 - 如有必要,请提交新的更改。

更新分支

你已经在your_branch上开发了一段时间,所以在trunk上有其他人,现在你必须将他们的更改添加到your_branch。

1 - 首先,更新您的分支机构结账并提交任何未完成的更改。

2 - 搜索Subversion日志以查看您上次合并更改的修订版号(或者在创建原始分支时,如果您从未合并过)。这对于成功合并至关重要:

svn log --limit 500 | grep -B 3 your_branch

3 - 还要注意当前的头版修订:

svn info svn://server.com/svn/repository/trunk | grep Revision

4 - 将trunk上的最后一个合并修订版和trunk上的头版修订版的差异合并到your_branch工作副本中,将LAST_MERGED_REVISION替换为步骤2中记录的修订版号,将HEAD_REVISION替换为步骤3中记录的修订版号:

  svn merge -r LAST_MERGED_REVISION:HEAD_REVISION \
  svn://server.com/svn/repository/trunk .

5.a - 查找输出中的错误。可以找到所有文件吗?事情是否被删除了应该没有?也许你做错了。如果您需要还原,请运行svn revert -R

5.b - 如果5.a中的内容似乎没问题,请检查是否存在冲突,解决发现的任何冲突:

svn status | egrep '^C|^.C'

6 - 提交合并,将COMMAND替换为步骤4中的确切命令内容。

svn ci -m "Merged changes from trunk to your_branch: COMMAND"       

将分支折回主干

嘿,your_branch已经完成了。现在它必须成为主干。

1 - 首先,按照上一节中的每一步(“更新分支”),使your_branch与trunk上的任何最近更改同步。

2 - 完全删除主干:

svn del svn://server.com/svn/repository/trunk

3 - 将your_branch移动到旧的行李箱位置:

svn mv svn://server.com/svn/repository/branches/your_branch \
svn://server.com/svn/repository/trunk

4 - 将您的工作副本重新安置回主干:

svn switch --relocate \
svn://server.com/svn/repository/branches/your_branch \
svn://server.com/svn/repository/trunk 

完成!

请欣赏有关此程序的任何建议,意见或反馈。

2 个答案:

答案 0 :(得分:2)

如果您还没有这样做,我建议您阅读branching + merging section here

您引用的帖子已经很久了(2007年8月)并且过时了。从颠覆1.5(2008年6月)开始,合并跟踪已经有了很大的改进(你可以创建分支并执行合并,而subversion实际上会跟踪哪些修订已经从主干中合并到你身上)。在颠覆1.6(2009年3月)中,这已得到进一步改善。

我特别不喜欢这个建议

  

2 - 完全删除主干

     

svn del svn://server.com/svn/repository/trunk

作为管理主干的一种方式。这似乎有点容易出错(如果两个功能分支想要同时合并,会发生什么)。我倾向于分享most recent comment on the post的观点。

相反,当您准备好时,您可以执行“重新集成”合并以从分支合并回主干。这会将您的分支机构中的相关变更集应用到主干。

答案 1 :(得分:1)

  

svn switch --relocate \   svn://server.com/svn/repository/trunk \   的svn://server.com/svn/repository/branches/your_branch

- 重定位选项是切换到另一个仓库。新分支是干线的副本,所以切换。

只是做:

svn switch ^/branches/your_branch
  

svn info | grep URL   svn up

此更新大部分时间都不起作用。

  

svn merge -r LAST_MERGED_REVISION:HEAD_REVISION \    svn://server.com/svn/repository/trunk。

大多数时候我使用TortoiseSVN但只尝试:

 svn merge ^/trunk .

尝试这是否有效,应该如此。关于合并跟踪,较新的SVN使用merge-info属性,因此大多数时候它应该知道要合并的内容。有问题你的方法应该运作良好。

  • ^ /是repozitory relative url。
  • svn info ^ /试试你的svn版本是否可用(你应该在svn文件夹中)

部分删除分支吓到了我......

尝试:

#请注意您的分支应该是最新的(在分支的早期解决大多数冲突)  svn switch ^ / trunk  svn merge --reintegrate ^ / branches / your_branch。

解决冲突;)

svn commit -m“reintegrated your_branch”  svn delete ^ / branches / your_branch

大多数情况下,如果您不知道如何处理它,最好删除此分支(这不是那么容易,删除它并创建新的更好)。

还要注意更改您在其他分支/中继中更改的名称/重定位文件。这将导致树冲突。如果其他分支没有变化,可以自由地进行。