git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: custom merge driver vs. CONFLICT (delete/modify)

From
Jakub Narebski <jnareb@gmail.com>
Date
Sep 26, 2010, 10:17 UTC
Message-ID
<m38w2ohks3.fsf@localhost.localdomain>
In-Reply-To
<1285445444-sup-3857@flatty.sascha.silbe.org>
Sascha Silbe <sascha-ml-reply-to-2010-3@silbe.org> writes:
Show 23 quoted lines
> I am (automatically) building snapshot packages by combining the packaging
> maintained in one repository (but also containing sources) with (more
> recent) upstream sources from another repository.
> 
> For some files (those touched by rerunning auto*) I want the local
> version to always take precedence. For some other files (autogen.sh, PO
> files) I want the upstream version to take precedence. For all the rest
> I want conflicts to produce an error.
> 
> This has worked fine so far by using custom merge drivers, but while
> adding the second one I encountered a problem: Merge drivers are only
> invoked for modify/modify (and maybe add/add) conflicts.
> More specifically a delete/modify conflict will cause git-merge to bail
> out directly without calling the merge driver to resolve the conflict.
> Such a conflict occurred because the packaging people removed autogen.sh
> (which is reasonable for them, but not for me).
> 
> Is there a way to either resolve all kinds of conflicts in favour of
> one side (like -X <side>) or always take one side (like -s <side>) for
> a specific set of files?
> Alternatively, is there a way to do a merge in multiple "steps",
> operating only on a subset of the files each time (so I can use
> -s <side> / -X <side> for two of three steps per merge)?

Well, you can create your own merge strategy (see git-merge-ours.sh in contrib/examples/ as an example), put it in appropriate place, and use '--strategy=<name>' to force using your own custom merge strategy.

The problem you see is that merge *driver* (as set by gitattributes) deals only with _file-level_ conflicts, i.e. it is run instead of ordinary diff3-based merge. The CONFLICT(Delete/modify) is solved on the _tree_ level by a merge *strategy*. Currently there is no way to change how tree-level conflict is resolved, without creating your own merge strategy. Though in princile it doesn't seem impossible...

-- 
Jakub Narebski
Poland
ShadeHawk on #git
Previous: Sascha SilbeNext: Enrico Weigelt
Message 2 of 3 in “custom merge driver vs. CONFLICT (delete/modify)”
  1. Sascha SilbeSep 25, 2010
  2. Jakub NarebskiSep 26, 2010
  3. Enrico WeigeltSep 26, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.