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