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

Re: The config include mechanism doesn't allow for overwriting

From
Jeff King <peff@peff.net>
Date
Oct 24, 2012, 00:51 UTC
Message-ID
<20121024005130.GA19638@sigill.intra.peff.net>
In-Reply-To
<CAEBDL5V0Ffyp306rVo-USCBy_AXXMHXN1yrWmkF1BhzFaq60nA@mail.gmail.com>
On Tue, Oct 23, 2012 at 08:46:47PM -0400, John Szakmeister wrote:
Show 26 quoted lines
> On Tue, Oct 23, 2012 at 10:13 AM, Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
> [snip]
> > And git config --get foo.bar will give you:
> >
> >     $ git config -f /tmp/test --get foo.bar
> >     one
> >     error: More than one value for the key foo.bar: two
> >     error: More than one value for the key foo.bar: three
> >
> > I think that it would be better if the config mechanism just silently
> > overwrote keys that clobbered earlier keys like your patch does.
> >
> > But in addition can we simplify things for the consumers of
> > "git-{config,var} -l" by only printing:
> >
> >     foo.bar=three
> >
> > Or are there too many variables like "include.path" that can
> > legitimately appear more than once.
> 
> I frequently use pushurl in my remotes to push my master branch both
> to the original repo and my forked version.  I find it very helpful in
> my workflow, and would hate to lose that.  That said, I do like the
> idea of having a config file and the ability to override some of the
> variables.

No, that won't go anywhere. We really do have two classes of variables: things that are expected to be single values, and things that are expected to be lists.

From the perspective of the config code, we don't know or care which is which, and just feed all entries sequentially to a C callback. In practice, the callbacks do one of two things:

  1. Append the values into a list.
  2. Overwrite, and end up with the final value seen.

The trouble is that git-config has to print the values in a reasonable way, so it asks the caller to give a hint about which it wants (--get versus --get-all). But in the single-value case did not behave like the C callbacks, which is what my series fixes.

Using "git config -l" is more like asking the config machinery to just feed us everything, which is what the C callbacks see. Which is more flexible, but way less convenient for the caller. But it doesn't need to be fixed, since the caller has all the information to implement whatever semantics they like.

-Peff
Previous: John Szakmeister
Message 25 of 25 in “The config include mechanism doesn't allow for overwriting”
  1. Ævar Arnfjörð BjarmasonOct 22, 2012
  2. Jeff KingOct 22, 2012
  3. Ævar Arnfjörð BjarmasonOct 23, 2012
  4. 0/8 fix git-config with duplicate variable entriesJeff King, Oct 23, 2012
  5. 1/8 t1300: style updatesJeff King, Oct 23, 2012
  6. Johannes SixtOct 24, 2012
  7. Jeff KingOct 24, 2012
  8. 1/8 t1300: style updatesJeff King, Oct 24, 2012
  9. 2/8 t1300: remove redundant testJeff King, Oct 23, 2012
  10. 3/8 t1300: test "git config --get-all" more thoroughlyJeff King, Oct 23, 2012
  11. 4/8 git-config: remove memory leak of key regexpJeff King, Oct 23, 2012
  12. 5/8 git-config: fix regexp memory leaks on error conditionsJeff King, Oct 23, 2012
  13. 6/8 git-config: collect values instead of immediately printingJeff King, Oct 23, 2012
  14. 7/8 git-config: do not complain about duplicate entriesJeff King, Oct 23, 2012
  15. 8/8 git-config: use git_config_with_optionsJeff King, Oct 23, 2012
  16. Johannes SixtOct 24, 2012
  17. Ævar Arnfjörð BjarmasonOct 24, 2012
  18. Junio C HamanoNov 20, 2012
  19. Jeff KingNov 21, 2012
  20. Junio C HamanoNov 21, 2012
  21. Jeff KingNov 21, 2012
  22. Junio C HamanoNov 21, 2012
  23. Joachim SchmitzNov 23, 2012
  24. John SzakmeisterOct 24, 2012
  25. Jeff KingOct 24, 2012

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.