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

Re: Get rid of .git/branches/ and .git/remotes/?

From
Linus Torvalds <torvalds@osdl.org>
Date
Nov 20, 2005, 18:09 UTC
Message-ID
<Pine.LNX.4.64.0511200935081.13959@g5.osdl.org>
In-Reply-To
<Pine.LNX.4.63.0511201748440.14258@wbgn013.biozentrum.uni-wuerzburg.de>
On Sun, 20 Nov 2005, Johannes Schindelin wrote:
> 
> I just had a crazy idea. Since we have a framework in place to read/write 
> .git/config, I thought that maybe it would be a nice thing to move the 
> information which is in .git/branches or .git/remotes into the config.

I considered it, but thee thing is, it really wants "nested names", ie having multi-level base-names for the variables. At the same time, I absolutely _abhor_ horrible crap like XML, which make nesting a fundamental part of their structure.

XML may be "logical", but it has absolutely zero to do with being human-readable and clean. In short, XML is total and absolute CRAP (in fact, the "X" in "XML" stands for "Crap", but the XML designers were also incredibly bad spellers).

So while the basic notion of the git ini file does support nesting (we could just make variable names be "base.level1.final" or any number of levels deep), I don't know what a sane format would be. I have one suggestion that in my opinion "fits" the .ini file syntax (see below), but people may well hate it.

Basically I've considered saying that one or more '.' characters at the start of a section name would mean "re-use the previous one", so we could have (this is a really bad example, just to show the implications):

	[core]
		[.values]
			fixed = true
			nested = fine
			[..example]
				test = Hell yes
		[.other]
			example = strange
		[.]
			name = hi
	[section]
		example = yet another
and that would result in a parse of
	core.values.fixed = true
	core.values.nested = fine
	core.values.example.test = Hell yes
	core.other.example = strange
	core.name = hi
	secontion.example = yet another

and that seems reasonably clean. I'd also allow explicit multi-level section names:

	[core.values]
		fixed = true
so you could always write the above config file in an alternate format:
	[core.values] fixed = true
	[core.values] nested = fine
	[core.values.example] test = Hell yes
	[core.other] example = strange
	[core] name = hi
	[section] example = yet another

instead, using no implicit nesting at all (or, indeed, even re-using sections like "core.values").

That would allow things like
	[branches]
		[.origin]
			url = master.kernel.org:/pub/scm/git/git.git
			pull = master:origin
		[.mine]
			url = my.domain.com:/other/repo
			pull = master:mine
(which could also be written as
	[branches.origin]
		url = master.kernel.org:/pub/scm/git/git.git
		pull = master:origin
	[branches.mine]
		url = my.domain.com:/other/repo
		pull = master:mine

and the following mixed-indentation usage would be technically correct, but perhaps crazy:

	[branches.origin]
		url = master.kernel.org:/pub/scm/git/git.git
		pull = master:origin
	    [.mine]
		url = my.domain.com:/other/repo
		pull = master:mine

Basically, right now we only allow alphanumeric characters in the base name, and a new section name completely clears the old one. The above would be a very simple extension of that: we would allow '.' in addition to alphanumerics, and any initial '.' characters would _keep_ that many levels of the old name.

I dunno. That seems a nice extension, and it would make these things very unambiguous. But how do other .ini-file-like things do this?

And I'm not 100% convinced that putting these branches in the config file has any real advantages over keeping them as separate files. Having everything in one place is nice, of course, and being able to copy just one file around might be convenient, but it _does_ make the config file more complicated.

Anyway, if you want to play with this, here's a trivial patch that may or may not work.

		Linus
----
diff --git a/config.c b/config.c
index 915bb97..3b9f300 100644
--- a/config.c
+++ b/config.c
@@ -136,6 +136,19 @@ static int get_base_var(char *name)
 			return -1;
 		if (c == ']')
 			return baselen;
+		if (c == '.') {
+			if (!baselen || name[baselen-1] == '.') {
+				for (;;) {
+					if (!name[baselen])
+						return -1;
+					if (name[baselen++] == '.')
+						break;
+				}
+				continue;
+			}
+			name[baselen++] = c;
+			continue;
+		}
 		if (!isalnum(c))
 			return -1;
 		if (baselen > MAXNAME / 2)
Previous: Johannes SchindelinNext: Sven Verdoolaege
Message 2 of 62 in “Get rid of .git/branches/ and .git/remotes/?”
  1. Johannes SchindelinNov 20, 2005
  2. Linus TorvaldsNov 20, 2005
  3. Sven VerdoolaegeNov 20, 2005
  4. Linus TorvaldsNov 20, 2005
  5. Andreas EricssonNov 20, 2005
  6. Johannes SchindelinNov 20, 2005
  7. Petr BaudisNov 26, 2005
  8. Junio C HamanoNov 27, 2005
  9. Josef WeidendorferNov 20, 2005
  10. Johannes SchindelinNov 20, 2005
  11. Josef WeidendorferNov 22, 2005
  12. Johannes SchindelinNov 22, 2005
  13. Andreas EricssonNov 22, 2005
  14. Johannes SchindelinNov 23, 2005
  15. Junio C HamanoNov 23, 2005
  16. Andreas EricssonNov 23, 2005
  17. Johannes SchindelinNov 23, 2005
  18. Andreas EricssonNov 24, 2005
  19. Junio C HamanoNov 24, 2005
  20. Rename git-config-set to git-repo-configJohannes Schindelin, Nov 24, 2005
  21. Junio C HamanoNov 24, 2005
  22. Johannes SchindelinNov 24, 2005
  23. Junio C HamanoNov 24, 2005
  24. Johannes SchindelinNov 24, 2005
  25. Junio C HamanoNov 26, 2005
  26. Linus TorvaldsNov 26, 2005
  27. Linus TorvaldsNov 26, 2005
  28. 0/8 Make C-level operable from subdirectoriesJunio C Hamano, Nov 26, 2005
  29. Junio C HamanoNov 26, 2005
  30. Ryan AndersonNov 26, 2005
  31. Junio C HamanoNov 27, 2005
  32. Petr BaudisNov 27, 2005
  33. Linus TorvaldsNov 27, 2005
  34. Petr BaudisNov 27, 2005
  35. Linus TorvaldsNov 27, 2005
  36. Junio C HamanoNov 28, 2005
  37. Linus TorvaldsNov 28, 2005
  38. Junio C HamanoNov 28, 2005
  39. Linus TorvaldsNov 28, 2005
  40. Junio C HamanoNov 28, 2005
  41. Junio C HamanoNov 28, 2005
  42. ls-tree: Resurrect funny name quoting lost during rewrite.Junio C Hamano, Nov 28, 2005
  43. Junio C HamanoNov 26, 2005
  44. 1/8 git-apply: work from subdirectory.Junio C Hamano, Nov 26, 2005
  45. Linus TorvaldsNov 26, 2005
  46. Junio C HamanoNov 26, 2005
  47. Junio C HamanoNov 27, 2005
  48. Lars Magne IngebrigtsenNov 27, 2005
  49. 2/8 peek-remote: honor proxy config even from subdirectory.Junio C Hamano, Nov 26, 2005
  50. 3/8 fsck-objects: work from subdirectory.Junio C Hamano, Nov 26, 2005
  51. 4/8 checkout-index: work from subdirectory.Junio C Hamano, Nov 26, 2005
  52. 5/8 hash-object: work within subdirectory.Junio C Hamano, Nov 26, 2005
  53. 6/8 ls-tree: work from subdirectory.Junio C Hamano, Nov 26, 2005
  54. Linus TorvaldsNov 26, 2005
  55. 7/8 Make networking commands to work from a subdirectory.Junio C Hamano, Nov 26, 2005
  56. 8/8 Make the rest of commands work from a subdirectory.Junio C Hamano, Nov 26, 2005
  57. Josef WeidendorferNov 22, 2005
  58. Johannes SchindelinNov 23, 2005
  59. Josef WeidendorferNov 23, 2005
  60. Johannes SchindelinNov 23, 2005
  61. Lars Magne IngebrigtsenNov 27, 2005
  62. Junio C HamanoNov 27, 2005

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.