【问题标题】:SVN modifies svn:mergeinfo property on files with no changeSVN 修改文件上的 svn:mergeinfo 属性而不做任何更改
【发布时间】:2024-01-20 03:53:01
【问题描述】:

我有一个 svn 的“问题”,我不明白为什么有时当我合并两个分支时,它会报告修改了文件的 mergeinfo 属性,而文本没有更改。
这是正常行为吗?
如果不是,可能是什么问题?

【问题讨论】:

    标签: svn mergeinfo


    【解决方案1】:

    嗯,你确实合并了这两个分支。正确的?按预期工作。

    您所做的是进行合并。即使合并没有导致任何代码更改,这在合并中并不少见,Subversion 仍然标记合并已完成。如果没有别的,标记你做了一个合并——即使它没有导致任何变化,仍然是一个好主意。想象一下发布了一个版本,有人说“等等,没有人将该分支合并回主干!我们将不得不推迟发布,直到我们完成它”,因为他们没有看到合并到svn:merge-info 记录中。

    所以,是的,您所看到的可能是正常行为。

    现在,如果您的问题是“为什么我的更改没有被合并”,那就是另一个问题了。 Subversion 通常在合并方面做得很好,但你必须确保你做一些事情:

    • 仅从项目的根目录合并,而不是单个分支和文件。有例外,但大多数时候您应该合并项目的分支。否则,你最终会得到svn:merge-info
    • 知道何时使用--reintegrate 标志。您有一个分支“A”(在本例中可能包括主干)。你从分支“A”创建了一个分支“B”
      • 从“A”合并到“B”时,不要使用--reintegrate
      • 当你从“B”合并到“A”时,记得使用--reintegrate。它改变了 Subversion 处理合并的方式。
    • Subversion 不能很好地处理高度复杂的合并情况。如果你让一个分支有一大堆分支,并在它们之间来回合并,Subversion 就会搞砸。这是我告诉人们不要做按功能分支业务的原因之一。它使跟踪各种合并变得困难,并可能导致 Subversion 出现合并问题。也许这是一个特性:由于 Subversion 不能很好地处理这些高度复杂的合并情况,因此您必须避免它们。通过简单地说明 Subversion 无法处理,我已经能够说服许多经理放弃高度复杂的反模式分支方案。
    • 如果您手动合并文件(许多开发人员更喜欢这样做:手动将分支中的更改应用回主干),请使用svn merge --record-only,以便 Subversion 知道您已经完成了合并。当开发人员手动进行一些合并而其他人允许 Subversion 进行合并时,就会产生欢闹。

    因此,如果 Subversion 没有合并它应有的更改,请确保您正确使用了 --reintegrate,并且您没有遇到上述其他问题。

    【讨论】:

    • 是的,但是例如,如果在我的 N 修订版中,我更改了分支 B1 中的文件 Controller.java ,然后我将其重新集成到主干为什么在我提交之前我在 trunk 的根目录和 configuration.xml 中更改了 mergeinfo 属性(例如)?这对我来说听起来很奇怪......
    • 您只是合并了一个文件,还是合并了根目录中的所有内容,而这是唯一合并的文件?如果您是从项目的根目录合并,那是唯一合并的文件。项目的根获得svn:mergeinfoconfiguration.xml 被更改,因为有人只对那个文件做了svn merge,现在它也必须跟踪合并。因此,svn:mergeinfo 也得到了更新。这就是为什么我说总是从项目的根目录合并。否则,您最终会得到数千个文件——每个文件都有自己的svn:mergeinfo
    • 好的,但是没有人碰configuration.xml,这就是问题所在,如果没有任何修改,SVN设置mergeinfo属性...
    • 如果该文件具有svn:mergeinfo 属性,则表示有人对该文件进行了合并,并且仅在遥远的过去合并了该文件。 svn:mergeinfo 设置在合并的根目录上(这就是我陈述第一点的原因)。在文件或目录上设置svn:mergeinfo 后,即使它不在树的根目录上,它也会在每次合并时更新。见Mergeinfo Inheritance。您可以删除configuration.xml 上的svn:mergeinfo 属性以停止合并跟踪。然后,它不会更新它。
    • 找到missing paper。这将解释关于 Subversion 中合并跟踪的一切,以及为什么 configuration.xml 文件上有一个 svn:mergeinfo 属性。
    【解决方案2】:

    svn:mergeinfo 属性用于跟踪有关已在您的存储库中执行的合并的信息。

    详见 SVNBook:"Mergeinfo and Previews"

    【讨论】:

    • 是的,我读过,但为什么它会跟踪不受合并影响的文件的信息?