乌龟SVN总是合并45个额外文件

16

当我们使用svn进行分支和合并时,总是会发生同样的事情。

我们获取主干的最新副本。

创建并切换到一个分支。

在分支上对某个文件进行一些小修改。

将分支合并回主干。

此时,我们会有一个需要提交的文件以及45个额外的文件。这在每次分支和合并时都会发生,并且始终是相同的45个额外文件。我不知道如何解决这个问题,但它非常令人恼火。

有人以前见过这种情况吗?

更新: 当我提交时,实际更改的文件的文本状态为已修改,属性状态为空。 "45个文件"的所有文本状态都是正常的,属性状态为已修改。


如果您能描述清楚这45个额外的文件是什么,那将非常有帮助。 - Jon Skeet
可能是重复的问题:https://dev59.com/anRC5IYBdhLWcg3wKtv2 - MPelletier
4个回答

12
他们可能是合并信息属性。在SVN的1.5版本中,它非常激进地设置了合并信息属性,并且随着您进行合并,这些属性会得到更新 - 需要对它们进行提交。
答案是从它们中删除合并信息属性。同时升级到1.6版本,它具有更好的合并信息支持(即写入这些属性的内容更少)。
我应该说,如果您查看差异,这些文件将没有可见的更改。显然,如果它们的内容被更改,则更改的内容可能会给您一个提示(例如,自动化工具是否编写额外的注释,修改布局或添加行到顶部或底部)。

编辑:有关 SVN 合并问题和修复,请参见此博客文章


这是我应该经常做的事情吗?在CodingHorror发布一条不祥的推文后,我对升级到1.6版本感到担忧。 - Jonathan Beerhalter
我已经升级了我的客户端(tortoise),缓存可能会导致资源管理器暂停;我会继续使用1.5.5版本一段时间,并且在合并时要更加小心 - 我倾向于仅在“顶层”目录上进行合并,从未遇到过这个问题。 - gbjbaanb
我最近在合并代码时发现了一些额外的文件,并意识到它们是之前已经合并过的文件。你能确认从除了你的项目根目录以外的所有地方删除svn:mergeinfo属性是否安全?有什么负面影响需要考虑吗?还有...你认为这是一个错误还是预期行为? - Mark Renouf
1
mergeinfo 简单地告诉 SVN 已经合并了哪些内容。如果删除它,你就会回到旧的手动合并方式 - 即合并所有内容,或者合并你自己选择的修订版本范围。如果你从现在开始只从根目录合并,你仍然可以从中获得 mergeinfo 的好处。(顺便说一句,从子目录中删除 MI 被称为 elison 或 eliding 它们,请搜索 SVN 邮件列表了解更多信息)。开发人员正在努力改进它。 - gbjbaanb

6

很可能是合并信息属性引起的问题,你可能需要清理你的主干(trunk)中文件和文件夹上的合并信息属性。使用批处理文件来处理这个问题会更方便,因为你将来可能需要再次进行清理。以下是一个示例:

echo Removing Nested Merge Information...

svn propdel svn:mergeinfo subfolder1 --depth=infinity

svn propdel svn:mergeinfo subfolder2 --depth=infinity

svn propget svn:mergeinfo --depth=infinity trunk

在使用批处理文件对主干工作副本运行后,将提交回主干。

此外,重命名和移动文件夹是在子版本库中为文件夹/文件生成合并信息属性的常见方法。 svn1.6不会像添加各种操作的合并信息属性那样慷慨。


3

请阅读详细文章,网址为http://www.collab.net/community/subversion/articles/merge-info.html

虽然篇幅较长,但很值得一读。特别注意最后的“Parting Thoughts”部分中的建议,其中包括减少合并信息噪音的提示。

另外,不要使用svn propdel来清除不需要的合并信息,考虑使用带有--record-only选项的svn merge命令。


1

个人认为,至少在当前的工具状态下,合并信息比解决问题更多。一旦它在提交时变得透明,也许就值得使用了。

您可以安全地删除合并信息属性。但是,请注意,您需要手动跟踪要合并的修订版以进行重新整合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接