Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让mercurial发出冲突文件的基本版本以及修改版本?_Mercurial - Fatal编程技术网

如何让mercurial发出冲突文件的基本版本以及修改版本?

如何让mercurial发出冲突文件的基本版本以及修改版本?,mercurial,Mercurial,我试图使用mercurial将两个分支合并在一起,但存在一些冲突。在Subversion中工作时,合并冲突将导致冲突文件被统一的diff替换,即添加了“.mine”扩展名的文件的我自己的版本,以及添加了“.rxxx”扩展名的文件的最后签入版本 使用mercurial,我只获得了统一的diff以及添加了“.orig”扩展的我自己的版本 我习惯于自己在eclipse中使用“Compare-With>Other”命令或使用FileMerge在自己的时间编辑合并,但是,如果不手动获取基本修订版,则无法使

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

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

我习惯于自己在eclipse中使用“Compare-With>Other”命令或使用FileMerge在自己的时间编辑合并,但是,如果不手动获取基本修订版,则无法使用基本修订版,因此我无法再以这种方式工作

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


是否可以使用设置或扩展来实现此目的?

您可以设置HGMERGE环境变量

Mercurial通常会首先尝试使用简单的合并算法合并文件,以查看它们是否可以合并而不发生冲突。只有当存在冲突的更改时,hg才会实际执行合并程序

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

还有其他选项,如内部:失败、内部:本地或内部:其他

在hgrc中:

[ui]
merge = your-merge-program

[merge-tools]
kdiff3.args = $base $local $other -o $output
所以,您应该能够根据需要指定合并程序的参数。也许,您可以采用这种技术来启动Eclipse

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

export HGMERGE=false
事实上,如果您想提前知道冲突,可以使用hgmerge的“preview”选项

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

如何设置一个合并工具,只保存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
a
.mine
和一个
.theres
。您可以在
~/.hgrc
中设置一次,然后使用它。

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


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

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

[ui]
merge = internal:dump

您将回到以前的Subversion时代,或者接近它的时代。

我不想在执行hg merge命令时进行合并-我更喜欢在自己的时间进行合并,而不是一次完成所有合并。我真正感兴趣的是是否有可能让mercurial使用我的工作流程,而不是我的工作流程使用mercurial。感谢更新,但它仍然没有解决问题的实质。Subversion会发出一个文件,其中包含合并失败时的基本版本以及进行本地编辑的版本。Mercurial只发出后者。我希望它也能发射出前一种信号,或者可能会找到一些可以轻松访问的黑客。谢谢Ry4an。这很有效。$base和$other有什么区别?
base
我的
其他的
他们的
)的共同祖先;两者所依据的修订。Subversion只会给你
我的
其他的
。是的,在mercurial中进行合并比在svn中更经常地在没有帮助的情况下成功,这在很大程度上说明了为什么mercurial中的合并会比在svn中成功——因为祖先是被跟踪的,所以你可以找到$base。我注意到,即使mercurial成功地自动合并了文件,它也会发出.base、.mine和.theres。有没有办法阻止这种情况发生?嗯,试着在配置中添加一行
copy.premerge=True
。到目前为止,我一直假设它默认为true,但建议如果内部合并成功,则true值会阻止合并工具运行。另外,如果将ui.merge设置为internal:merge,则会在文件中获得冲突标记。但是,您无法在工作副本中获得单个版本。。。我通常更喜欢它,因为它允许您在一个简单的文本编辑器中内联查看更改。这些内部合并工具记录在哪里?如果您想在自己的时间合并文件,这非常好。只需执行
hg merge--tool internal:merge
,然后执行
hg resolve--list
以查看仍需要合并的内容,然后执行
hg resolve--tool kdiff3 filename
(或任何您喜欢的合并工具)。很好的提示。