有没有一种方法可以关闭TortoiseSVN中的 svn:mergeinfo?

71

当我进行TortoiseSVN合并操作时,它会将一些目录和文件包含到修改的文件中,即使实际上没有做任何更改。

它会改变属性svn:mergeinfo

这些目录/文件设置的属性是否有必要?是否有方法可以避免对svn:mergeinfo进行这些更改?

通常我只是还原项目然后提交,但这浪费了额外的时间。

10个回答

45
很可能发生这种情况是因为先前的合并设置了svn:mergeinfo属性。一般不建议以一种使合并信息写入单个文件的方式合并单个文件或目录。您应该养成在工作流程中尽可能高层次地合并的习惯,以便将合并信息属性仅设置在结构目录(例如/trunk或/branches/1.0)上。
但是,如果确实存在单个文件和文件夹上的合并信息属性,则有两件事可以做:第一件事是从相关文件和目录中删除svn:mergeinfo属性。除非您真正知道自己在做什么以及可能产生的影响,否则我不认为这是一个推荐的做法。在执行此操作之前,请阅读文档!
第二件事是按照SVN希望您执行的方式提交属性更改,如果您信任软件,那么这可能是正确的做法。
话虽如此,我一直与我的团队合作,以养成良好的习惯,以便我们不再遇到此类麻烦。

3
谢谢,看起来设置这个属性的文件几乎是随机的,而且这必须是来自之前的开发人员从非根目录合并的。我会将它们移除。 - Brian R. Bondy
1
非常感谢您澄清了这件事情的发生 :) - TheXenocide
我按照你的建议编辑了属性,告诉svn一切都很好。但是有一个问题...起初,我使用trunk当前版本更新了分支的额外元数据文件。当我尝试重新集成到主干工作副本时,svn告诉我必须先更新。我进行了更新并注意到svn版本已经增加了。这很明显:分支中属性的提交导致全局版本号被提高。然后我再次编辑了合并信息,这次指定了比当前版本提前一个修订版本的trunk版本。然后一切都正常了。 - Diego Medaglia
当我尝试从分支合并更改时,我收到了相同的消息 - 同样是分支创建修订版。当我取消选中分支创建修订版时,它就像魔法般地工作了。谢谢。 - drinovc

40

SVN 1.7及以后版本

这个问题在SVN 1.7中得到了修复。从发行说明中可以看到:

如果子树(具有自己的显式合并信息)未受合并影响,则合并不再记录子树上的合并信息(描述合并)。这应该极大地减少对于拥有大量具有显式合并信息的子树的用户而言,出现虚假svn:mergeinfo属性更改的数量。

SVN 1.7 之前的版本

问题在于,一旦文件/文件夹具有显式的合并信息,每次合并到分支时都会更新该合并信息,即使该文件/文件夹与合并无关也是如此。这很烦人,因为每次合并都会在更改列表中引入越来越多的混乱。

为了避免这种情况,请仅将合并直接放置至分支的“根”文件夹中,例如“/branches/maintenance2.x”。此时,“/branches/maintenance2.x”下的任何文件或文件夹都不应获得合并信息。请遵循SVN书中的合并建议

不幸的是,即使您仅在分支的“根”文件夹上进行合并,空的svn:mergeinfo属性仍然会出现在单独的文件和文件夹上,以指示它们未收到与其同级别文件的相同合并。

删除多余的子树合并信息可能是安全的。一种方法是对项目根目录中的每个文件和文件夹进行递归删除svn:mergeinfo属性。(但请保留根文件夹本身的合并信息!)

或者你可以升级到Subversion 1.6。我已经验证了它可以解决这个问题。似乎它甚至会为你删除早期版本添加的多余合并信息。

从评论中判断,还存在在SVN 1.6中出现多余子树合并信息的情况。但是我无法复现。


12
我可以确认,svn 1.6 无法解决这个问题。 - Mike Miller
仅仅使用1.6版本并不能解决这个问题,因为这实际上是预期的功能,尽管对于使用典型分支/主干模型的人来说可能有点烦人。 - TheXenocide
@Malcolm:我指的是客户端。 - Wim Coenen
我正在使用svn 1.6.6,并确认它并未解决问题。 - Jahanzeb Farooq
1
我正在使用svn 1.7x,并确认我仍然在根目录的直接子级上产生合并信息的问题。 - Bryce Schober
显示剩余2条评论

14

如果你使用 --ignore-ancestry 选项进行合并,则合并信息属性将首先不会被创建。

svn merge --ignore-ancestry -c 1234 svn://sourcecontrol .

7
如果你勾选了 忽略祖先,它将不会在文件夹中创建svn合并信息。如果你已经得到了svn合并信息,只需还原它,然后再次执行合并操作,勾选"忽略祖先"即可。

3

svn:mergeinfo是Subversion用于跟踪合并历史的属性。我建议您让它自行处理...您可能需要在以后进行合并历史跟踪,并发现它不起作用,因为您没有提交这些属性。


我同意,那只是元数据,随着 SVN 客户端软件(如 TortoiseSVN)的发展,它会变得更有用。 - EnocNRoll - AnandaGopal Pardue

2

在Stack Overflow的问题“删除不必要的svn:mergeinfo属性”中给出的命令将会删除任何额外的合并信息。

From the root of the project do:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"

1
我想补充一下,这个 bug 的至少一个部分已经在 Subversion 1.5.5 中得到修复。从 1.5.5 CHANGES file 可以看到:
do not create mergeinfo for wc-wc moves or copies (r34184, -585)

也就是说,在 SVN 1.5 之前存在一个 bug,它会创建一些没有使用且多余的合并信息条目,如果原始提问者有很多 svn:mergeinfo 属性,那么很可能就是这个问题。


0

很棒的问题和答案!我们最近一直遇到这个问题,因为我们试图解决自动构建系统的限制。我们的构建系统会自动增加版本和路径信息的 .bdsproj 和一些 .dpr/.dpk 文件。

我想改变这种情况...但现在,如果你想将一个分支合并到另一个分支,你会得到你更改的少量文件,以及构建机器更改的1000个文件。所以我们一直在进行“有针对性”的合并,有时是逐个文件地合并。特别是对于那些有合法更改(例如包含额外单元)的 .dpr 或 .bdsproj 文件。 现在我知道了发生了什么,所以我希望能够停止这种疯狂的行为。

感谢 Stack Overflow!


0
我们团队也遇到了这个问题,它让整个合并过程变得有些混乱。在阅读了这篇文章之后,我尝试从一些文件中删除了 svn:mergeinfo 属性,并经过进一步的测试,看起来这解决了问题。

我尝试从一些文件中删除svn:mergeinfo属性 -- 如何操作?以及哪些文件? - Luke

0

我们在项目中递归地删除了它,因为几乎所有文件都有这些信息,这使得合并非常麻烦(如果只有一个文件被更改,所有文件都必须合并)。从现在开始,我们只会在根目录上进行合并,这样可以避免将来出现这种情况。

到目前为止,它还没有给我们带来任何问题。文件上的日志仍然可用,并且似乎是相同的(但无论如何,请自行承担风险!)。

哦,我们是在新建分支之前对主干进行的操作。这样,我们就可以从干净的状态开始。


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