3

我的问题是,在按照以下程序合并时,在最佳实践方案中,“将分支折叠回主干”程序的最后一步是否是正确的方法?

我已经使用 svn 很多年了。在我的个人项目中,我总是很高兴地在trunk 上破解,并且在很长一段时间内以单行线性方式进行版本控制已经接近完美。简单高效。一切都很幸福,直到有一天我想要更多地控制 3rd 方库

今天,我在一个项目中,我觉得已经超越了从树干直接破解的方法。我有多个 3rd 方库,其中一些每周都会更改,我确实需要对其中的内容进行更多控制。我需要能够查看 3rd 方库版本之间的特定变更集并跟踪我对特定库所做的更改。我见过几次代码库变得非常混乱,并且很难在没有经验的 buildmaster 的情况下恢复可用状态,我不能在时间上明智地在这里出错。

所以我研究了供应商分支,在这里和那里阅读了几篇文章。我有一本很棒的“带有 Subversion 的版本控制”一书,但我看到的例子有时在他们的方法上是矛盾的,我想理解“分支”。我正要遵循Evan Weaver 在这篇文章中给出的方法

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

创建分支

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

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

2 - 将主干的干净远程副本制作到分支文件夹中。给它起个名字。我们将其命名为 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 - 将主干上的最后一个合并版本和主干上的头版本的差异合并到 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 - 在输出中查找错误。能找到所有文件吗?不应该删除的东西被删除了吗?也许你做错了。如果需要还原,请运行 svnrevert -R

5.b - 如果 5.a 中一切正常,检查冲突,解决任何发现的冲突:

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

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

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

将树枝折回树干

嘿,你的分支完成了。现在它必须成为主干。

1 - 首先,按照上一节中的每个步骤(“更新分支”),以便 your_branch 与主干上的任何最新更改同步。

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 

完毕!

请对此程序的任何建议、意见或反馈表示赞赏。

4

2 回答 2

2

如果您还没有这样做,我建议您阅读此处的分支 + 合并部分

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

我特别不喜欢这个建议

2 - 完全删除主干

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

作为管理主干的一种方式。充其量这似乎有点容易出错(如果两个功能分支想要同时合并回来会发生什么)。我倾向于分享对帖子的最新评论的看法。

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

于 2011-06-17T13:40:19.843 回答
1

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

--relocate 选项是切换到另一个 repo。新分支是主干的副本,因此请切换。

做就是了:

svn switch ^/branches/your_branch

svn 信息 | grep URL svn up

大多数情况下,此更新将无济于事。

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

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

 svn merge ^/trunk .

试试这是否可行,它应该。关于合并跟踪,较新的 SVN 使用合并信息属性,所以大多数时候它应该知道要合并什么。有问题你的方法应该很好用。

  • ^/ 是存储库的相对 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

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

还要注意更改名称/重新定位您在其他分支/主干中更改的文件。这将导致您发生树冲突。如果其他分支没有变化,则免费。

于 2011-06-17T18:03:10.370 回答