在SVN中的分支之间合并单个文件是否“安全”?

时间:2012-10-04 15:00:54

标签: svn version-control merge

如何在SVN中合并单个文件的问题是answered before,所以我的问题是:这样做是否安全?如果我最终在某个时候合并整个分支,SVN会“获取”特定文件已经合并吗?如果我在合并整个分支之前来回合并更改会怎么样?

1 个答案:

答案 0 :(得分:14)

是的,您可以合并单个文件,但通常会将其视为不良做法

问题在于Subversion使用svn:mergeinfo来跟踪合并。如果文件没有此svn:mergeinfo属性,则它使用父目录的svn:mergeinfo。当您合并单个文件时,所有这些文件现在都有自己的svn:mergeifno属性。

这会导致真正的问题吗?不,Subversion运行正常。这个问题只是被察觉了。每次Subversion更新svn:mergeinfo属性时,即使该文件的内容没有更改,它也会创建该文件的另一个版本。

这是一个问题,当你将一个主干合并到一个分支(反之亦然)。你运行这样的命令:

$ svn merge http://svn.mycorp.com/svn/project/trunk .

您会看到100多个已修改的文件,但您知道只应合并3或4个文件。

检查这些文件,您发现唯一的区别是svn:mergeinfo属性已更改为显示您已将最新内容合并到这些文件中(即使它不会更改文件本身的内容)。没有实际问题。只需允许Subversion在提交时更新这些文件的svn:mergeinfo属性,一切都很好。是的,合并将显示如果您执行svn log,则会在提交中更改100多个文件,但仔细检查会显示只有svn:mergeinfo属性已更改。

您不应该做的是还原这些文件。这将标志着更改未合并到这些文件中(即使它没有更改其内容)。下一次合并将尝试重新合并先前的合并并造成更大的破坏。

有时当开发人员看到这一点时,他们会开始向我抱怨修改。毕竟,如果文件本身没有变化,为什么要修改这些文件?他们对所有svn:mergeinfo更改感到沮丧。

这就是为什么它被认为最佳实践始终在项目的根目录而不是单个文件中进行合并。这样,只有项目根目录下的目录才能获得svn:mergeinfo属性,项目中的所有其他文件都只使用svn:mergeinfo属性。

如果您和您的所有开发人员都明白这一点,并且愿意提出这种行为,那么合并单个文件就没有问题。由于这种复杂情况,通常不会这样做。