1

我有一个在 Mercurial 下运行的项目,我发现很多情况下文件需要手动合并,而我认为它应该能够自动合并。我想知道是否可以为 Mercurial 提供任何选项来帮助解决这些问题。

该项目有一个底层平台,其中包含数百个无法在项目上编辑的文件。当平台更新时,项目会在 Mercurial 之外获取这些核心文件的更新版本。我反复看到的顺序是:

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

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

在我的 Linux 机器上:

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

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

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

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

4

1 回答 1

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的好地方——比 Stack Overflow 好得多。

于 2012-04-25T15:17:52.760 回答