Differences between revisions 6 and 13 (spanning 7 versions)
Revision 6 as of 2008-06-03 09:12:26
Size: 2584
Comment: Overriding merge.ui configuration from the command line
Revision 13 as of 2012-05-17 21:30:45
Size: 4983
Editor: mpm
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
In February 2008, [:mpm:Matt Mackall] contributed a new [:Merge:merge] tool configuration feature. This feature is available in version 1.0 (see [:WhatsNew]). #pragma section-numbers 2
Line 3: Line 3:
=== Details ===
To describe a new merge tool, do something like the following in [:.hgrc]:
<<Include(A:style)>>

= Merge Tool Configuration =

How to customize which merge tools Mercurial chooses.

<<TableOfContents>>

== Introduction ==

Mercurial delegates most non-trivial file-level merging operations to an external program, called a merge tool. In most installations, Mercurial will automatically search your system for the 'best' available tool, based on a set of known tools in its [[Source:contrib/mergetools.hgrc|global configuration]].

This tool choice can be extensively customized based on various properties like filename, binary data, running in a GUI, etc.

== Defining a merge tool ==

To define a merge tool, add something like the following in [[.hgrc]]:
Line 8: Line 23:
 mymergetool.args=$local $other $base -o $output  mymergetool.something = something
}}}
which will define ''mymergetool'' (the left hand side until the first dot). The option values defines the behaviour of the tool.

For each file changed in both parents Mercurial chooses a merge tool. The merge tool is chosen from the list of file pattern matches in the {{{[merge-patterns]}}} section followed by all tools sorted by decreasing {{{priority}}} order. The list is filtered for whether the {{{executable}}} (defaulting to ''mymergetool'') can be found, whether it supports {{{symlinks}}} or {{{binary}}} files, and whether {{{gui}}} is available. To bypass the priority scheme and set the default tool directly, specify the merge tool in {{{[ui]}}} sections {{{merge}}} option. For backwards compatibility the tool {{{hgmerge}}} is implicitly added with lowest priority.

If the chosen merge tools {{{premerge}}} is True then an internal merge is attempted, and if it seems successful then the result it will silently be used without running the actual merge tool.

The merge tool is run with an argument list of {{{args}}} with the following variables expanded:
 * {{{$output}}} expands to the existing ''file'' which already contains the version from the first parent - and this is also where the result of the merge ends up / must end up
 * {{{$local}}} expands to ''file.orig'' which is created as a copy of ''file'' in the working directory version - it thus contains the unmerged version from the first parent
 * {{{$base}}} expands to ''/tmp/file~base.*'' which is created with the version from the common ancestor revision (see {{{hg debugancestor}}})
 * {{{$other}}} expands to ''/tmp/file~other.*'' which is created with the version from the new second parent revision which the first parent is merged with

Example configuration:
{{{
 [merge-tools]
 mymergetool.priority = 100
 mymergetool.premerge = False
 mymergetool.args = $local $other $base -o $output
 myimgmerge =
 [merge-patterns]
 **.jpg = myimgmerge
 **.exe = internal:fail
Line 11: Line 49:
If you've got no other merge tools defined, Mercurial will run
"mymergetool" with the appropriate arguments. Further tool options
include:
Further tool options include:
Line 22: Line 57:

..etc.
Line 26: Line 59:
If you have multiple tools defined, Mercurial looks for the highest
priority one that will work, falling back to the old hgmerge for
backwards compatibility.
== Internal merge with conflict markers ==
Line 30: Line 61:
If that's not found, we'll use our internal simplemerge code, which is a
tool named 'internal:merge'. There are also three other internal tools:
local, other, and fail.

To bypass the priority scheme and set the default tool directly, simply
set [ui]merge as always.

Merge tool settings suitable for a global configuration file (and
roughly equivalent to the ugly old hgmerge script) can be found in
contrib/mergetools.hgrc. People building binary packages will want to
use this.

To complete the picture, we also now support choosing a merge tool based
on file pattern, like so:
Mercurial has a selection of "internal" tools for various purposes (ee [[Topic:merge-tools]] for full details). The most interesting of these is `internal:merge`, which provides a traditional merge with conflict markers. To set this as your default tool, simply add the following to you config:
Line 46: Line 64:
[merge-patterns]
**.jpg = myimgmerge
**.exe = internal:fail
[ui]
merge = internal:merge
Line 51: Line 68:
=== References ===
 * "[http://selenic.com/repo/hg/rev/5af5f0f9d724 merge: allow smarter tool configuration]" in [http://selenic.com/repo/hg/shortlog main Mercurial repository] (changesets starting with 5af5f0f9d724)
 * "[http://selenic.com/pipermail/mercurial/2008-February/016923.html New merge tool system in mainline]", posting by Matt Mackall, Feb 3, 2008, [http://selenic.com/pipermail/mercurial/ Mercurial mailing list]
This is not generally recommended as Mercurial gets no direct feedback when merges are successfully completed, and it's not terribly user-friendly compared to modern tools.

(!) When using `internal:merge`, you'll want to carefully read the help for the [[Cmd:resolve]] command to avoid losing your merge work.
Line 56: Line 73:
 * [:MergeProgram]  * [[Topic:merge-tools]]
 * [[
MergeProgram]]
Line 60: Line 78:
In February 2008, [[mpm|Matt Mackall]] contributed this new [[Merge|merge]] tool configuration feature. This feature is available in version 1.0 (see [[WhatsNew]]).

 * "[[http://selenic.com/repo/hg/rev/5af5f0f9d724|merge: allow smarter tool configuration]]" in [[http://selenic.com/repo/hg/shortlog|main Mercurial repository]] (changesets starting with 5af5f0f9d724)
 * "[[http://selenic.com/pipermail/mercurial/2008-February/016923.html|New merge tool system in mainline]]", posting by Matt Mackall, Feb 3, 2008, [[http://selenic.com/pipermail/mercurial/|Mercurial mailing list]]
Line 61: Line 84:
To have the internal merge with the conflict markers for example in [:TortoiseHg] set To have the internal merge with the conflict markers for example in [[TortoiseHg]] set
Line 69: Line 92:
See [:TipsAndTricks#mergemineortheir:How to keep "My" or "Their" files when doing merge] for an example on how you can override merge configuration on the command line. See [[TipsAndTricks#mergemineortheir|How to keep "My" or "Their" files when doing merge]] for an example on how you can override merge configuration on the command line.

----
CategoryHowTo

{i} This page does not meet our wiki style guidelines. Please help improve this page by cleaning up its formatting.

Merge Tool Configuration

How to customize which merge tools Mercurial chooses.

1. Introduction

Mercurial delegates most non-trivial file-level merging operations to an external program, called a merge tool. In most installations, Mercurial will automatically search your system for the 'best' available tool, based on a set of known tools in its global configuration.

This tool choice can be extensively customized based on various properties like filename, binary data, running in a GUI, etc.

2. Defining a merge tool

To define a merge tool, add something like the following in .hgrc:

 [merge-tools]
 mymergetool.something = something

which will define mymergetool (the left hand side until the first dot). The option values defines the behaviour of the tool.

For each file changed in both parents Mercurial chooses a merge tool. The merge tool is chosen from the list of file pattern matches in the [merge-patterns] section followed by all tools sorted by decreasing priority order. The list is filtered for whether the executable (defaulting to mymergetool) can be found, whether it supports symlinks or binary files, and whether gui is available. To bypass the priority scheme and set the default tool directly, specify the merge tool in [ui] sections merge option. For backwards compatibility the tool hgmerge is implicitly added with lowest priority.

If the chosen merge tools premerge is True then an internal merge is attempted, and if it seems successful then the result it will silently be used without running the actual merge tool.

The merge tool is run with an argument list of args with the following variables expanded:

  • $output expands to the existing file which already contains the version from the first parent - and this is also where the result of the merge ends up / must end up

  • $local expands to file.orig which is created as a copy of file in the working directory version - it thus contains the unmerged version from the first parent

  • $base expands to /tmp/file~base.* which is created with the version from the common ancestor revision (see hg debugancestor)

  • $other expands to /tmp/file~other.* which is created with the version from the new second parent revision which the first parent is merged with

Example configuration:

 [merge-tools]
 mymergetool.priority = 100
 mymergetool.premerge = False
 mymergetool.args = $local $other $base -o $output
 myimgmerge =
 [merge-patterns]
 **.jpg = myimgmerge
 **.exe = internal:fail

Further tool options include:

 <tool>.args - the arguments to pass (defaults to $local $base $other)
 <tool>.executable - executable name or path (defaults to <tool>)
 <tool>.binary - supports binary files (False)
 <tool>.symlinks - supports symlinks (False)
 <tool>.gui - requires a GUI (False)
 <tool>.priority - priority of this tool (0)

3. Internal merge with conflict markers

Mercurial has a selection of "internal" tools for various purposes (ee merge-tools for full details). The most interesting of these is internal:merge, which provides a traditional merge with conflict markers. To set this as your default tool, simply add the following to you config:

[ui]
merge = internal:merge

This is not generally recommended as Mercurial gets no direct feedback when merges are successfully completed, and it's not terribly user-friendly compared to modern tools.

(!) When using internal:merge, you'll want to carefully read the help for the resolve command to avoid losing your merge work.

3.1. See also

3.2. Notes

In February 2008, Matt Mackall contributed this new merge tool configuration feature. This feature is available in version 1.0 (see WhatsNew).

3.2.1. Choosing internal merge with conflict markers

To have the internal merge with the conflict markers for example in TortoiseHg set

[ui]
merge = internal:merge

in Mercurial.ini.

3.2.2. Overriding merge.ui configuration from the command line

See How to keep "My" or "Their" files when doing merge for an example on how you can override merge configuration on the command line.


CategoryHowTo

MergeToolConfiguration (last edited 2019-08-07 17:58:24 by GregTatum)