【问题标题】:Subversion mergeinfo messed up after merging trunk to branch将主干合并到分支后,Subversion mergeinfo 搞砸了
【发布时间】:2011-07-20 11:51:27
【问题描述】:

我正在测试最新版本的 Subversion,包括 SVN 命令行客户端和 TortoiseSVN。 (到目前为止,我一直在使用引入 mergeinfo 属性和 --reintegrate 合并开关之前的大部分版本。)

我已经完成了强制性的谷歌搜索,但要么有非常糟糕的 Google-fu,要么接下来的问题实际上是一个没有人解释和/或彻底解决的问题。我觉得这有点令人费解,因为这里有很多关于这个问题的报告——找到这些报告没有问题。我还找到了关于 mergeinfo 道具的其他讨论,但没有任何内容真正匹配并解释/解决我的经验。

如果能帮助我升级我的 Google-fu 或了解发生了什么以及如何处理它,我将不胜感激。

这里是:

  1. 我有一个主干(和一个基于它的工作副本)

  2. 我创建了一个分支(以及基于它的工作副本)

  3. 我对主干的WC做了一些改动并提交

  4. 我在分支的 WC 中做了一些工作并提交

  5. 我现在将主干中的工作合并到我分支的 WC,解决所有冲突。

到目前为止,一切都按预期进行,但是当我尝试提交合并结果时,我收到一条消息,指出工作副本已过时,需要先更新。

这毫无意义。 WC 在合并之前是最新的,合并的目标是 WC。所以在 repo 中根本不应该改变任何东西。

深入挖掘似乎是 mergeinfo 属性本身就是问题所在。

我单独提交更改的文件没有问题,但之后 WC 仍然脏/未完全提交,我仍然无法提交,因为 WC 不是最新的。因此,Subversion 似乎一直在处理 repo 和 WC 中的 mergeinfo 属性。

在我重复此调查的情况下,我可以先更新 WC,然后再提交。但我不确定情况是否总是如此,或者这种现象的其他变体将更难解决。我也不期待尝试向附近的 Subversion 用户“解释”这一点,他们没有将此作为他们的“主要工具”之一。

我已经反复测试了几年,我认为这个问题从引入 mergeinfo 和 --reintegrate 功能(1.5?)到现在一直存在。可以这样吗?它仍然没有解决?

我目前的测试已经使用命令行客户端(从 CollabNetSubversion-client-1.6.17-4.win32.exe 安装)和 TortoiseSVN (TortoiseSVN-1.6.16.21511-win32-svn-1.6.17.msi ),我得到相同的结果。

我已经使用 Subversion 很多年了,并且将自己描述为“超级用户”。尽管如此,在这个问题上,我还是站在我的裤子下面..

附录

以下是我可以重现问题的步骤:

  1. 在“C:\Documents and Settings\johndoe\My 文档\SVN\Repo"

  2. 使用 Repo 浏览器,创建“file:///C:/Documents and Settings/johndoe/My Documents/SVN/Repo/Trunk" (r1)

  3. 使用 Repo 浏览器,创建“file:///C:/Documents and Settings/johndoe/My Documents/SVN/Repo/Branches” (r2)

  4. 在“C:\Documents and Settings\johndoe\My Documents\SVN\WCs\Trunk”中创建主干的工作副本(无新版本)

  5. 在trunk中,创建一个文本文件test.txt,添加并提交(r3)

  6. 在“file:///C:/Documents and Settings/johndoe/My Documents/SVN/Repo/Branches/Branch1”(r4)中创建主干分支

  7. 在“C:\Documents and Settings\johndoe\My Documents\SVN\WCs\Branch1”中创建此分支的工作副本(无新版本)

  8. 在基于Trunk的工作副本中,添加一行文本到test.txt并提交(r5)

  9. 在基于Branch1的工作副本中,添加一行文本到test.txt并提交(r6)

  10. 将主干合并到分支。右键单击“C:\Documents and Settings\johndoe\My Documents\SVN\WCs\Branch1",Tortoise SVN,合并。 合并类型“合并一系列修订”,要合并的 URL: "file:///C:/Documents and Settings/johndoe/我的 Documents/SVN/Repo/Trunk",要合并的修订:,工作 复制:“C:\Documents and Settings\johndoe\My Documents\SVN\WCs\Branch1",其他一切默认。在 Resolve 冲突对话“稍后解决”。 (没有新版本)

  11. 解决冲突。右键单击文件,Tortoise SVN,编辑 冲突。在 TortoiseMerge 中,标记并选择“Theirs before mine”, 点击“标记为已解决”,保存退出。 (没有新版本)。

  12. 尝试在 Branch1 中提交更改。

此时我收到一条消息

Commit
C:\Documents and Settings\johndoe\My Documents\SVN\WCs\Branch1
Commit failed (details follow): 
Directory '/Branches/Branch1' is outof date 
You have to update your working copy first.

这对我来说没有意义:在合并之前,工作副本是最新的。之后没有创建新的修订(repo HEAD 仍然是 r6),现在我的工作副本不是最新的。

进一步调查,似乎早在第 9 步和第 10 步之间更新 Branch1 的 WC 就可以解决问题。同样,这对我来说毫无意义: i) 在更新结束时的对话中,没有任何报告为实际更新,并且 ii) 分支中唯一改变的事情已经提交。 因此,在我看来,WC 既“干净”(没有未提交的内容)又是最新的(repo 中没有任何内容可以为 WC 做出贡献)。

该更新实际上所做的唯一事情是将 Branch1 工作副本的 BASE 从 r4 更改为 r6。这在某种程度上很重要,但现在我的头在旋转,以至于我无法确定细节。

如果有任何新鲜的想法能让我了解这里发生了什么,我将不胜感激。

附录 2

进一步试图澄清我的想法:指向的常见问题解答说

当 Subversion 提交时,客户端只会修改版本号 提交涉及的节点,而不是工作副本中的所有节点。这 意味着在单个工作副本中,文件和子目录 可能处于不同的修订版,具体取决于您上次提交的时间 他们。在某些操作中(例如,目录属性 修改),如果存储库具有更新版本的 节点,提交将被拒绝,以防止数据丢失。

在我的例子中,我将“节点”解释为“file:///C:/Documents and Settings/johndoe/My Documents/SVN/Repo/Branches/Branch1”。正如我所看到的,存储库没有“[那个]节点的更新版本”。总的来说,repo 的 HEAD 是 r6,但相关节点的最新版本是 r4。

【问题讨论】:

    标签: svn merge tortoisesvn branch


    【解决方案1】:

    这与 mergeinfo 属性无关,而是与 文件夹 上的属性(好的,在本例中为合并信息属性)被修改的事实有关。

    请参阅FAQ 关于此的条目。

    【讨论】:

    • 很尴尬,我没有找到那个常见问题解答。对不起。
    • 很遗憾我没有找到并阅读该常见问题解答,但我认为它不适合我的情况。它谈论“酸味提交”和“混合修订”。我有一个干净的厕所(在 r26 承诺和最新)。我以那个 WC 为目标进行合并。回购仍然是 r26。当我尝试提交合并结果时,SVN 说我的 WC 已过时,但自​​从我更新以来,还没有创建任何新的修订。我想我错过了一些基本的东西,也很尴尬,但我根本看不到它。
    • 好的,做了一个新的测试,如果我必须解决任何冲突,问题是 100% 可重复的。如果颠覆设法在没有我的帮助/干预的情况下进行合并,一切都会顺利。
    • 继续我的调查,并准备展示一个干净、经过验证且可重复的示例。现在我不能重复了……我会继续努力,当我有实质性的东西时会回来。感谢您的参与,斯特凡!
    • 请注意:对我的原始问题进行了大量附录,其中包含重现“现象”的步骤。
    【解决方案2】:

    你并不孤单:我也看到了这一点。它似乎不会引起问题,并且当您尝试将属性提交到具有更高版本的子文件夹时,它似乎会表现出来。因此,在某种意义上,您的节点存在更高版本:来自更高版本的版本与来自早期版本的版本具有不同的子节点。我没有看代码,但我想这些子节点以类似于存储属性的方式存储在节点上。

    【讨论】:

    • 我知道我并不孤单。但是 ATM 我认为/理解没有新版本的“我的节点”。当我有时间时,我将在旧版本(“预重新集成”)上测试运行它并确认它不会在那里发生。就个人而言,我在使用 SVN 时进行更新没有问题,但是......我帮助/教授使用 SVN 的其他人,并且我基于对“底层模型”的推理来构建它,这种现象打破了我对该模型的看法。我讨厌不得不说“好吧,这是我无法解释的事情 - 只是接受它很奇怪并且你将不得不......”。下一次教学活动 9 月 12 日。救命!
    【解决方案3】:

    在做了一些实验之后,Stefans 的回答更有意义了。他绝对正确,这不是特定于 mergeinfo 属性。我通过将我自己的任意属性放在我的分支工作副本的顶部文件夹来验证这一点。

    我仍然对公式感到好奇

    在某些操作中(例如,目录属性修改), 如果存储库具有更新版本的节点,则提交 将被拒绝,以防止数据丢失。 从分支的时候开始(分支已经产生了r4)I

    • 此时创建此分支的 WC(顶层目录和该目录中的唯一文件都是最新且干净的(没有未提交的更改)。
    • 编辑文件并提交(HEAD 是 r5,目录的 COMMITTED 是 r4,文件的提交是 r5)
    • 在 WC 中的目录上放置一个属性

    再一次,当我尝试提交时,我得到了错误。问题出在文件夹节点上。

    SVN STAT 产量:

    C:\SVN T2\WCs\Branch1>svn stat
     M      .
    

    DIFF 仅显示文件夹的一个更改(添加的属性):

    C:\SVN T2\WCs\Branch1>svn diff
    
    Property changes on: .
    ___________________________________________________________________
    Added: je:dummy
       + Dummy value
    

    最后,INFO 说:

    C:\SVN T2\WCs\Branch1>svn info
    Path: .
    URL: file:///C:/SVN%20T2/Repo/Branches/Branch1
    Repository Root: file:///C:/SVN%20T2/Repo
    Repository UUID: 009c3a97-e14f-234a-92e9-d30c537e29f9
    Revision: 4
    Node Kind: directory
    Schedule: normal
    Last Changed Author: SEEKDAHLJ
    Last Changed Rev: 4
    Last Changed Date: 2011-07-27 09:26:53 +0200 (on, 27 jul 2011)
    

    所以我的目录 BASE 是 r4,HEAD 也是 r4,而且我有一个未提交的更改。我看不出可能有什么冲突。

    如果有人能对此有所了解,我将不胜感激。我错过了什么?

    进一步实验,做类似的序列,但将文件添加到目录而不是添加属性,没有这样的冲突。

    所以是的,这尤其与属性有关,我剩下的问题是,是否有人可以描述实际发生冲突的场景?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2011-11-25
      • 2012-11-24
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多