【问题标题】:How to get mercurial to emit base revision of conflicted file as well as modified version?如何让 mercurial 发出冲突文件的基本版本以及修改版本?
【发布时间】:2010-09-24 07:28:29
【问题描述】:

我正在尝试使用 mercurial 将两个分支合并在一起,但存在一些冲突。在 Subversion 中工作时,合并冲突会导致冲突的文件被统一的 diff 替换,我自己的带有“.mine”扩展名的文件版本以及最后签入的带有“.rxxx”的文件版本" 添加了扩展名。

使用 mercurial,我只能获得统一的差异以及添加了“.orig”扩展名的我自己的版本。

我习惯于自己在 Eclipse 中使用“比较 > 彼此”命令或使用 FileMerge 自己编辑合并,但是由于基本修订不可用,除非手动去获取它,我不能不再这样工作了。

我不想在 hg merge 命令期间执行合并 - 我更喜欢在自己的时间执行。

我可以使用设置或扩展来实现这一点吗?

【问题讨论】:

  • 附带说明,如果您将 ui.merge 设置为 internal:merge,那么您将在文件中获得冲突标记。但是,您不会在工作副本中获得单独的版本...我通常更喜欢这个,因为它允许您在简单的文本编辑器中查看内联更改。

标签: mercurial


【解决方案1】:

我们有一个内置的合并工具,称为internal:dump。所以与

[ui]
merge = internal:dump

你会被带回到美好的 Subversion 时代,或者更接近它的时代。

【讨论】:

  • 这些内部合并工具记录在哪里?
  • hg 帮助合并工具
  • 也可以在每个命令的命令行中指定。例如。 "hg 解析 --tool=:dump"
【解决方案2】:

如何设置一个合并工具,只保存 mercurial 正在创建的文件以供合并工具操作?

[ui]
merge = copy

[merge-tools]
copy.executable = /path/to/mycopy.sh
copy.args = $base $local $other $output

然后在 mycopy.sh 中执行如下操作:

#!/bin/sh
cp $1 $4.base
cp $2 $4.mine
cp $3 $4.theirs

这应该总是立即成功,并为每个冲突的文件留下.base.mine.theirs。您可以在 ~/.hgrc 中设置一次并完成它。

【讨论】:

  • 感谢 Ry4an。这很好用。 $base 和 $other 有什么区别?
  • basemineother (theirs) 的共同祖先;两者所依据的修订。 Subversion 只给你mineother
  • 是的,为什么 mercurial 中的合并在没有帮助的情况下比在 svn 中更频繁地成功 - 因为跟踪祖先,因此可以找到 $base。
  • 我注意到即使 mercurial 成功地自动合并文件,它也会发出 .base、.mine 和 .theirs。有没有办法阻止这种情况发生?
  • 嗯,尝试将 copy.premerge = True 行添加到您的配置中。到目前为止,我一直认为它默认为 true,但 the wiki 建议如果内部合并成功,则 true 值会阻止合并工具运行。
【解决方案3】:

看看hg resolve 命令。一旦开始合并,但在提交之前,您可以使用resolve 列出有冲突的文件,以及将冲突标记为已解决或未解决,或者重新启动合并过程,所有这些都在单个文件的粒度而不是变更集.

它不会为您提供您想要的文件(尽管请参阅 @Ry4an 的回答),但它可以在您想解决任何特定文件时为任何特定文件启动合并工具。

【讨论】:

  • 如果您想在自己的时间合并文件,这非常好。只需执行hg merge --tool internal:merge,然后执行hg resolve --list 以查看仍需要合并的内容,然后执行hg resolve --tool kdiff3 filename(或您喜欢的任何合并工具)。很棒的提示。
【解决方案4】:

您可以设置 HGMERGE 环境变量。

Mercurial 通常会首先尝试使用简单的合并算法来合并文件,以查看它们是否可以在没有冲突的情况下合并。只有当存在冲突的更改时,hg 才会真正执行合并程序。

您可以将其设置为一些 GUI 合并工具等。

还有其他选项,例如 internal:fail、internal:local 或 internal:other

在 hgrc 中:

[ui]
merge = your-merge-program

[merge-tools]
kdiff3.args = $base $local $other -o $output

所以您应该能够根据您的所有需要​​指定合并程序的参数。或许,您可以采用这种技术来启动 Eclipse。

要使合并在冲突时立即失败,请尝试

export HGMERGE=false

其实如果你想提前知道冲突,可以使用hg merge的“预览”选项

-P --preview  review revisions to merge (no merge is performed)

【讨论】:

  • 我不想在 hg 合并命令期间进行合并 - 我更喜欢在自己的时间而不是一次完成。我真的只是对是否可以让 mercurial 与我的工作流程一起工作感兴趣,而不是我的工作流程与 mercurial 一起工作。
  • 感谢您的更新,但它仍然没有解决问题的实质。 Subversion 发出一个文件,其中包含合并失败的基本修订以及具有本地编辑的版本。 Mercurial 只发出后者。我希望它也能发出前者,或者可能找到一些使其易于访问的 hack。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
相关资源
最近更新 更多