6

我试图通过将主干合并到分支中来保持功能分支的最新状态。问题是,在创建分支时大约有 2000 个文件,并且在分支和主干上都保持不变,除了 svn:mergeinfo 什么都没有更新。该项目规模相当大,对我们的 SVN 历史记录的影响如此之大,以至于它导致合并提交历史记录无法使用,因为它实际上标记了数千个已更改的文件,即使这些文件的唯一更改是由 SVN 完成的本身。

我努力了

  • 使用与 Repo 相同的客户端版本 ( 1.5.2 )
  • 使用我当前的客户端版本 1.6.10
  • 合并一系列修订,从分支开始到头部

我应该提一下,在尝试此操作时,我一直在仔细查看 SVN 文档。所以不应该打破任何规则(例如,没有切换的子树,干净的本地副本等)

4

4 回答 4

8

基本上要清理存储库,您需要在集成分支上运行以下命令,以便从那里进行更改:-

C:> svn propdel svn:mergeinfo –R

即,您在主干中执行此操作,以便将来的版本和功能分支不会受到污染。合并现有分支时,您可以忽略“合并根”下的所有 svn:merginfo 更改,因为它们无论如何都会被继承。

不久前我写了一篇关于这个问题的博客,其中更详细地介绍了它:-

清理 svn:mergeinfo Droppings http://chrisoldwood.blogspot.com/2010/03/cleaning-up-svnmergeinfo-droppings.html

于 2010-09-24T13:54:50.763 回答
6

如果 svn 认为它们的合并历史与其父目录的不同,它会将 mergeinfo 属性添加到单个文件。一旦发生这种情况,每次后续合并,无论多么无害,都会导致这些 mergeinfo 属性被更新。我发现本文的前半部分有助于理解为什么会发生这种情况。

如果您想避免这些不断的 mergeinfo 更改,则必须“整理”分支上现有的 mergeinfo 属性。最安全但最费力的方法是svn propget -R svn:mergeinfo在分支上运行,然后研究单个文件上的mergeinfo与其父目录的mergeinfo之间的差异。您可能会发现差异很小,并且“svn merge”对少量单独的修订将足以触发mergeinfo elision,从而导致所有单独的mergeinfo 属性消失。

如果您确信自己了解 mergeinfo 的工作原理,您也可以直接介入并手动编辑或从有问题的文件中删除 mergeinfo。

于 2010-09-24T11:09:29.720 回答
1

如果您在没有真正更改过的文件上有这样的合并信息,或者其他人确实没有从工作副本根目录合并...唯一的解决方案是从文件中删除 svn:mergeinfo,因为唯一的位置在工作中复制root别处。还有一点,您应该将存储库更新为 1.6.X ..

于 2010-09-24T11:04:57.857 回答
0

由于我对盲目svn:merge-info删除属性没有信心,我已经实现了一个工具来分析工作副本的当前情况并从非根合并信息属性中删除尽可能多的合并修订。在额外的人工检查和控制之后,可以提交对工作副本的更改。

这里是:svn-clean-mergeinfo

不要犹豫,报告有关其使用的任何问题以改进它。

于 2015-03-09T11:17:09.557 回答