Mercurial需要手动合并意外

时间:2012-04-25 13:23:22

标签: mercurial merge

我有一个在Mercurial下运行的项目,我发现很多情况下文件需要手动合并,当我相信它应该能够自动合并时。我想知道Mercurial是否有任何选择可以在这些领域帮助它。

该项目有一个底层平台,有几百个文件无法在项目中编辑。更新平台后,项目将获得Mercurial之外的这些核心文件的更新版本。我反复看到的顺序是:

在中央开发系统上(链接到核心平台更新机制):

  • 获取新版本的核心平台。
  • 提交这些更改,例如hg commit -m "New platform release"
  • 推送到中央mercurial服务器

在我的Linux机上:

  • 提交本地更改
  • 从中央mercurial服务器拉出,并尝试合并
  • 查找核心文件上的合并冲突

我必须合并的最后两个核心文件在基本版本和本地版本之间没有任何变化(访问时间在构建期间更新,但内容相同)。唯一的变化是我正在合并的远程版本。

我所知道的唯一非标准配置是中央mercurial实例在Rhodecode下运行,并使用提交钩子设置来更新Redmine存储库。

还有什么可以在mercurial中配置以帮助它找出合并吗?

1 个答案:

答案 0 :(得分:1)

您可以重做与--debug的合并以获取有关合并的更多信息。也就是说,拿走您的存储库并执行

$ cd ..
$ hg clone my-project -r 123 -r 456 merge-test

其中123和456是您想要更近的合并的两个父母。然后运行

$ hg merge --debug

看看Mercurial说的话。如果仅在您合并的分支中更改了文件foo,它应该如下所示:

$ hg merge --debug
  searching for copies back to rev 2
resolving manifests
 overwrite: False, partial: False
 ancestor: 932f5550d0ce, local: b0c286a4a76d+, remote: c491d1593652
 foo: remote is newer -> g
updating: foo 1/1 files (100.00%)
getting foo
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

此处我处于修订版b0c286a4a76d并与c491d1593652合并。

您也可以使用

$ hg status --rev "ancestor(b0c286a4a76d, c491d1593652)" --rev "c491d1593652"
M foo
$ hg status --rev "ancestor(b0c286a4a76d, c491d1593652)" --rev "b0c286a4a76d"
M bar

仔细检查祖先修订版和您要合并的两个变更集之间的文件是否已更改。上面你看到我在一个分支上更改了foo而在另一个分支上更改了bar

如果你看到两个状态列表中都出现了一个平台文件,那么你的程序就会出现问题,这可以解释合并冲突。

如果这还不足以弄清楚出了什么问题,那么我建议在Mercurial邮件列表上提出这个问题。这是讨论和 bug-hunting 的好地方 - 比Stack Overflow好得多。