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

Re: [3/4] What's not in 1.5.2 (new topics)

From
APAndy Parkins <andyparkins@gmail.com>
Date
May 17, 2007, 04:39 UTC
Message-ID
<200705170539.11402.andyparkins@gmail.com>
In-Reply-To
<11793556371774-git-send-email-junkio@cox.net>
On Wednesday 2007, May 16, Junio C Hamano wrote:
Show 14 quoted lines
>      (3) git-checkout finds there is .gitmodules file in the
>          tree (and the checked-out working file), which
>          describes these subprojects.  It looks at the config
>          and notices that it does not yet know about them
>          (obviously this is true, as this is the first checkout
>          after clone, but I am trying to outline how checkout
>          after a merge should work in the general case).
>
> 	 It determines where to fetch that subproject from,
> 	 perhaps it uses the default URL described in
> 	 .gitmodules file to, while asking the user for
> 	 confirmation and giving the user a chance to override
> 	 it.  And it records something in the config -- now that
> 	 project is known to this repository.

I've been thinking about this .gitmodules thing and have a concern. Aren't we falling into the svn:externals trap?

The svn:externals property is analagous to our .gitmodules file. svn properties were basically just version controlled out-of-tree meta data (making them annoying to work with - in-tree is better).

svn "submodule" support was done by writing something like
  subproject svn://host/blah/blah

In the svn:externals property attached to the directory that the "subproject" directory was in. To translate:

  svn propset svn:externals "subproject svn://blah/blah/blah" .
  git clone git://blah/blah/blah subproject
  git add subproject

The hole that this sort of thing gets you in to is that the svn:externals property is version controlled. Time passes since you added the external; in that time the URL becomes invalid. No problem, you simply change the svn:externals property. KABOOM. Now any historical checkout fails because it checks out the svn:externals property from that checkout and tries to use the wrong URL.

Our in-tree .gitmodules will have the same problem. I recognise that you've mitigated that with some "confirm with the user, store in the config" hand waving; but that is just hiding the problem: the submodule URL is not something that should be version controlled; it is an all-of-history property; when it changes for revision N it changes for revision N-1, N-2, N-3, etc. Storing it in .gitmodules implies that it's value in the past has meaning - it doesn't.

You mentioned yourself that that problem is not confined to the temporal accuracy of .gitmodules, there is spatial accuracy too - there is no guarantee that user A wants to use the same submodule URL as user B. Fast forward to when we've got submodule support; let's say you start using it for git-gui (for example). Somehow (let's leave the "how" till later) I've gotten a working git tree with a git-gui checked out. I go to my laptop and clone that repository (note: NOT the upstream repository). When git-clone hits the git-gui submodule it should not go looking for the upstream git-gui, I will want it to clone my local git-gui submodule. i.e. in-tree .gitmodules URL for git-gui will be wrong.

I hope the above shows that in-tree .gitmodules is wrong; it can only ever be a hint, and in a great number of cases it will be an incorrect hint.

I know it's so enticing to store it in-tree; it would be great because the normal repository object transfer mechanism would get the URL of the submodule to the receiver with no changes to current infrastructure. I say: tough luck - we need another mechanism. The submodule URL is a per-repository setting, not a per-project setting. When fetching, some out-of-band mechanism for telling the other side what URL _this_ repository thinks the submodule is at needs to be supplied. I don't know what space there is in the git protocol for putting that information, but I suspect that that is where it needs to go.

As an alternative to that, the supermodule could be given the ability to proxy for the submodule during clone. It knows where the submodule is stored from it's point of view; is there scope for doing a virtual-server-like system were the supermodule git-daemon just changes to the submodule repository (in the case it is local) and thereby gives the downstream git access to the submodule without it even needing a URL.

Show 11 quoted lines
>  * Perhaps add 'tree' entries in the index.  This may make the
>    current cache-tree extension unnecessary, and I suspect it
>    will simplify various paths that deal with D/F conflicts in
>    the current codebase.
>
>    I suspect this might need 1.6, as it is a one-way backward
>    incompatible change for the 'index', but 'index' is local so
>    it might not be such a big deal.  In the worst case, when the
>    users find "git checkout" from 1.5.2 does not work in a
>    repository checked out with such an updated index format, we
>    could ask them to "rm -f .git/index && git checkout HEAD".

I don't think even that would be necessary. Assuming that the new index format is a superset of the old index format the only way that tree entries would get in the index would be by using git-1.6. Almost by definition then, if they are in there your git is up-to-date enough to use them. (modulo me not really understanding what you mean)

Andy
-- 
Dr Andy Parkins, M Eng (hons), MIET
andyparkins@gmail.com
Previous: Junio C HamanoNext: Junio C Hamano
Message 5 of 55 in “[0/4] What's not in 1.5.2 (overview)”
  1. Junio C HamanoMay 16, 2007
  2. 1/4 What's not in 1.5.2 (have been cooking in next)Junio C Hamano, May 16, 2007
  3. 2/4 What's not in 1.5.2 (will cook in next)Junio C Hamano, May 16, 2007
  4. 3/4 What's not in 1.5.2 (new topics)Junio C Hamano, May 16, 2007
  5. Andy ParkinsMay 17, 2007
  6. Junio C HamanoMay 17, 2007
  7. Andy ParkinsMay 17, 2007
  8. Alex RiesenMay 17, 2007
  9. Petr BaudisMay 17, 2007
  10. Jeff KingMay 17, 2007
  11. Petr BaudisMay 17, 2007
  12. Jeff KingMay 17, 2007
  13. Petr BaudisMay 17, 2007
  14. Jeff KingMay 17, 2007
  15. Junio C HamanoMay 17, 2007
  16. Jeff KingMay 18, 2007
  17. Junio C HamanoMay 17, 2007
  18. Nicolas PitreMay 17, 2007
  19. Michael S. TsirkinMay 17, 2007
  20. Josef WeidendorferMay 17, 2007
  21. Steven GrimmMay 18, 2007
  22. Petr BaudisMay 18, 2007
  23. Josef WeidendorferMay 18, 2007
  24. Torgil SvenssonMay 19, 2007
  25. Jakub NarebskiMay 18, 2007
  26. Petr BaudisMay 18, 2007
  27. Jakub NarebskiMay 19, 2007
  28. Junio C HamanoMay 18, 2007
  29. Julian PhillipsMay 18, 2007
  30. Junio C HamanoMay 18, 2007
  31. Petr BaudisMay 20, 2007
  32. News reader woes (was: Re: [3/4] What's not in 1.5.2 (new topics))Jakub Narebski, May 25, 2007
  33. Andy ParkinsMay 18, 2007
  34. Josef WeidendorferMay 18, 2007
  35. Andy ParkinsMay 18, 2007
  36. Michael S. TsirkinMay 18, 2007
  37. Josef WeidendorferMay 18, 2007
  38. Michael S. TsirkinMay 18, 2007
  39. Aidan Van DykMay 18, 2007
  40. Michael S. TsirkinMay 18, 2007
  41. Sven VerdoolaegeMay 19, 2007
  42. Jakub NarebskiMay 21, 2007
  43. Junio C HamanoMay 18, 2007
  44. Michael S. TsirkinMay 19, 2007
  45. Junio C HamanoMay 19, 2007
  46. Michael S. TsirkinMay 18, 2007
  47. Andy ParkinsMay 18, 2007
  48. Johannes SixtMay 18, 2007
  49. Michael S. TsirkinMay 18, 2007
  50. Andy ParkinsMay 18, 2007
  51. Steven GrimmMay 19, 2007
  52. Josef WeidendorferMay 19, 2007
  53. 4/4 What's not in 1.5.2 (other bits and pieces)Junio C Hamano, May 16, 2007
  54. Petr BaudisMay 18, 2007
  55. Michael S. TsirkinMay 18, 2007

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.