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

Re: [PATCH 3/3] builtin-merge: add support for default merge options

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 7, 2009, 00:58 UTC
Message-ID
<7v63imqhcz.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<76718490903061516l62869424q4bd4cfa64fe2195e@mail.gmail.com>
Jay Soffian <jaysoffian@gmail.com> writes:
Show 10 quoted lines
> On Fri, Mar 6, 2009 at 5:46 PM, Junio C Hamano <gitster@pobox.com> wrote:
>
>> When you are on branch "frotz", your config have both merge.options and
>> branch.frotz.mergeoptions, and you give some other options from the
>> command line, how should they interact?  I'd expect the branch.*.options
>> to take effect, ignoring merge.options entirely.
>
> Really? I didn't think that would be consistent with the fact that the
> the command line options override branch.*.options, but don't replace
> them.

I think cumulative option in configuration is bad in practice, but I'll explain why after talking about something else.

I think it would be much better if you did not introduce a new configuration merge.options which is not consistent with everything else to begin with.

Instead, if your addition was literally to allow saying things like this, it would be much easier to understand.

	[branch "*"]
        	mergeoptions = ...
                remote = origin
                rebase = true
	[branch "frotz"]
        	mergeoptions = ; nothing
                rebase = false
	[branch "nitfol"]
        	remote = xyzzy

When on branch 'nitfol', because there is an overriding "remote" defined, we would not look at branch.*.remote and fetch from xyzzy instead of fetching from the default origin. Because there is no "rebase" defined for that branch, we would use branch.*.rebase=true from the fall-back default.

When on branch 'frotz', because you have an explicit mergeoptions that says "I do not want any", it would override whatever is defined for the corresponding fall-back default branch.*.mergeoptions.

Having explained that I think branch.*.mergeoptions is syntactically nicer and more extensible as the UI to the end user, let's discuss the "cumulative" aspect. In the following, I'll keep using branch.*.$option, but you can read it as if I said merge.options and the discussion is the same.

There are two reasons why you as an end user specify a concrete value (e.g. "empty") for a concrete branch name (e.g. branch.frotz.mergeoptions). One is because you know the current value set to the fall-back default (e.g. branch.*.mergeoptions) is not suitable for this particular branch. Another is because you know you may want to change the fall-back default sometime in the future, and you do not want that to affect your setting you are making for this particular branch today.

For the purpose of the first reason above, if you allowed cumulative option, the end user needs to inspect branch.*.$option and come up with a countermanding set of options to set to branch.frotz.$option. If there is no cumulative option, the end user does not have to worry about what branch.*.$option says. Non-cumulative is simply easier to understand.

For the purpose of the second reason above, when the user has to update branch.frotz.$option because some external situation changed (e.g. the user used to be an e-mail contributor, but now gained "push privilege"; the user became the primary maintainer; etc.), the same argument on maintenance burden as above holds. To update branch.*.$option, you need to inspect every branch.$specific.$option (or lack thereof) as well in either way.

So overall, cumulative configuration tend to be more cumbersome for the end user to manage.

You cannot draw a direct analogy with the command line options, which is used as a single-shot override by nature. The user knows what usually happens when he says "git pull" while on branch 'frotz' without options, and countermanding specific aspects (but not necessarily others) of the operation for this single invocation. Because the configuration values are set so that the user can set-and-forget the exact syntax to invoke each feature, cumulativeness between configured default and command line override makes more sense.

Previous: Jay SoffianNext: Jay Soffian
Message 8 of 15 in “Re: how to have --no-ff be the default for all branch”
  1. 0/3 Re: how to have --no-ff be the default for all branchJay Soffian, Mar 6, 2009
  2. 1/3 config: add git_config_option_string()Jay Soffian, Mar 6, 2009
  3. 2/3 builtin-merge: refactor to use git_config_option_stringJay Soffian, Mar 6, 2009
  4. 3/3 builtin-merge: add support for default merge optionsJay Soffian, Mar 6, 2009
  5. Junio C HamanoMar 6, 2009
  6. Jay SoffianMar 6, 2009
  7. 3/3 builtin-merge: add support for default merge optionsJay Soffian, Mar 7, 2009
  8. Junio C HamanoMar 7, 2009
  9. Jay SoffianMar 7, 2009
  10. Junio C HamanoMar 7, 2009
  11. Jay SoffianMar 7, 2009
  12. jean-luc maletMar 7, 2009
  13. jean-luc maletMar 19, 2010
  14. Jay SoffianMar 19, 2010
  15. jean-luc maletApr 2, 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.