【问题标题】:TortoiseHg files shown in merge合并中显示的 TortoiseHg 文件
【发布时间】:2013-03-15 22:25:53
【问题描述】:

我正在编写代码来分析我们对Hg 的提交,并将我的结果与TortoiseHg 进行比较。在合并的情况下,我无法理解 TortoiseHg 的行为。

当我在TortoiseHg 中选择合并变更集时,受影响的文件列表仅显示那些有冲突的文件,除非我按下"Show All" 按钮。至少这似乎是意图,基于我从网络上收集到的信息,并且观察到如果我按下“显示全部”按钮,列表中显示的文件会有一个双头箭头。

我试图通过将变更集中的每个文件与父母双方进行比较来模拟这一点,并且仅在我的分析中包含与父母双方不同的文件。但是,我遇到了 TortoiseHg 在合并描述中显示的文件,但仅与一个父级不同。我在TortoiseHg 中也看到了这一点 - 与父级 1 或 2 的差异显示了变化,但另一个父级没有。

我还尝试使用 --git 选项进行差异化,以确保它不是我缺少的元数据更改,但这根本不会改变结果。

要获取有关我正在使用的变更集的信息:

hg log -v -r <rev> --removed --style xml

我选择合并变更集的父项,并为合并中的每个文件执行

hg diff -r <parent1> -r <rev> filename
hg diff -r <parent2> -r <rev< filename

我发现文件TortoiseHg 在我报告的合并摘要中显示为无冲突合并。

任何人都可以阐明差异吗?

更新: 我能够使用 TortoiseHg 本身的源代码重现这一点。

https://hg01.codeplex.com/tortoisehg克隆 在 tortoiseHg 中打开 repo 并选择 rev 12602 (58eb7c70)。这是与 12599 (6c716caa) 和 12601 (39c95a81) 的父代的合并。

TortoiseHg 将文件 tortoisehg/hgqt/repowidget.py 显示为合并中唯一的冲突文件,但

hg diff -r 12599 -r 12602 tortoisehg/hgqt/repowidget.py

什么都不返回,而

hg diff -r 12601 -r 12602 tortoisehg/hgqt/repowidget.py

显示两行变化。

【问题讨论】:

  • 您的存储库是公开的吗?有一些真实的数据可以让这更容易。
  • 很遗憾没有,但我会看看是否可以在公共回购中重新创建问题

标签: mercurial merge tortoisehg


【解决方案1】:

我想我已经弄清楚了 tortoisehg 的逻辑是什么(虽然我还没有检查出源来确定)。

正如您所猜到的,乌龟用双箭头显示合并两侧的文件已更改。但是,它并不仅仅查看合并与其每个父级的差异(例如 p1(58eb7c70)::58eb7c70p2(58eb7c70)::58eb7c70)。相反,tortoise 会查找合并中引入的所有更改,并比较两个父母的最后一个共同祖先。

我们以乌龟回购为例。 58eb7c70的血统图是:

Jonathan:tortoisehg $ hg log --graph -r ::58eb7c70 -l 5 --template "{node|short}\n{desc|firstline}\n\n"
o    58eb7c70d501
|\   Merge with stable (noop)
| |
| o  39c95a813105
| |  repowidget: show all errors on infobar
| |
| o  da7ff15b4b96
| |  repowidget: limit infobar error messages to 2 lines of up to 140 chars by default
| |
o |  6c716caa11fd
|\|  Merge with stable
| |
| o  48c055ad634f
| |  sync: show non-ascii command-line arguments correctly
| |

如您所见,merge 58eb7c70d501 合并了两个开发分支,一侧有一个变更集 (p1, 6c716caa11fd),另一侧有 两个 (p2, 39c95a813105 及其父级 da7ff15b4b96 )。这些分支的分歧点是 p1 和 p2 的最后一个共同祖先——48c055ad634f。

(最后的共同祖先可以直接用hg log -r "last(ancestor(p1(58eb7c70), p2(58eb7c70)))"找到)

让我们看看对这两个分支所做的更改。我们会将合并的每个父级与共同的祖先进行比较:

Jonathan:tortoisehg $ hg status --rev "48c055ad634f::6c716caa11fd"
M .hgtags
M tortoisehg/hgqt/commit.py
M tortoisehg/hgqt/compress.py
M tortoisehg/hgqt/hgemail.py
M tortoisehg/hgqt/postreview.py
M tortoisehg/hgqt/purge.py
M tortoisehg/hgqt/rename.py
M tortoisehg/hgqt/repowidget.py
M tortoisehg/hgqt/revset.py
M tortoisehg/hgqt/run.py
M tortoisehg/hgqt/settings.py
M tortoisehg/hgqt/status.py
M tortoisehg/hgqt/sync.py
M tortoisehg/hgqt/visdiff.py
M tortoisehg/util/cachethg.py
M tortoisehg/util/hglib.py

Jonathan:tortoisehg $ hg status --rev "48c055ad634f::39c95a813105"
M tortoisehg/hgqt/repowidget.py

这些是由 58eb7c70d501 实际合并的更改——自从它们分歧以来,两个分支上的一切都发生了变化。正如您所看到的,列表之间唯一的共同文件(两个分支上唯一更改的文件)是tortoisehg/hgqt/repowidget.py,正如您所期望的。您会看到该文件在 da7ff15b4b96 中发生了更改,该变更集不是合并的父级,但仍包含在从两个分支合并的更改中。

【讨论】:

  • 这很有意义。非常感谢您的深入分析。现在我知道如何在我自己的代码中重新创建该逻辑。非常感谢。
【解决方案2】:

tortoisehg/hgqt/repowidget.py6c716caa11fd 中被修改,这可以解释为什么您第二次调用hg diff 会得到结果;第一次调用比较了两个没有对tortoisehg/hgqt/repowidget.py 进行更改的修订;这对我来说似乎是合理的,除非我错过了关于 hg diff 行为方式的其他内容。

【讨论】:

  • diff 的行为对我来说很有意义。我想弄清楚为什么乌龟将此文件标记为在合并的每一侧都有更改(即冲突)。我最感兴趣的是尝试复制乌龟的行为,以便我对我们的提交和合并所做的分析将给出与乌龟相同的答案。仅基于差异,我会说文件合并没有冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 2020-04-21
  • 2014-03-19
  • 2017-06-19
相关资源
最近更新 更多