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

Re: [PATCH 6/6] Teach core object handling functions about gitlinks

From
Linus Torvalds <torvalds@linux-foundation.org>
Date
Apr 11, 2007, 15:16 UTC
Message-ID
<Pine.LNX.4.64.0704110753360.6730@woody.linux-foundation.org>
In-Reply-To
<20070411080641.GF21701@admingilde.org>
On Wed, 11 Apr 2007, Martin Waitz wrote:
Show 6 quoted lines
> 
> I only had little time to actually have a look at it but the core is
> very similiar to my approach and I'll try to rebase some of my code on
> top of yours in the following days.
> 
> The only thing I disagree with you is in using HEAD of the submodule:

Well, I don't actually see much choice. HEAD is just shorthand for "whatever is checked out".

> Always using HEAD of the submodule makes branches in the submodule
> useless.
No. 

Branches in submodules actually in many ways are *more* important than branches in supermodules - it's just that with the CVS mentality, you would never actually see that, because CVS obviously doesn't really support such a notion.

So I'd argue that branches in submodules give you:
 - you can develop the submodule *independently* of the supermodule, but 
   still be able to easily merge back and forth.
   Quite often, the submodule would be developed entirely _outside_ of the 
   supermodule, and the "branch" that gets the most development would thus
   actually be the "vendor branch", entirely outside the supermodule. Call 
   that the "main" branch or whatever, inside the supermodule it would 
   often be something like the remote "remotes/origin/master" branch.
   So inside the supermodule, the HEAD would generally point to something 
   that is *not* necessarily the "main development" branch, because the 
   supermodule maintainer would quite logically and often have his own 
   modifications to the original project on that branch. It migth be a 
   detached branch, or just a local branch inside the submodule.
 - branches inside submodules are *also* very useful even inside the 
   supermodule, ie they again allow topic work to be fetched into the
   submodule *without* having to actually be part of the supermodule,
   or as a way to track a certain experimental branch of the supermodule.
   I suspect that most supermodule usage is as an "integrator" branch, 
   which means that the supermodule tends to follow the "main 
   development", and the whole point of the supermodule is largely to have 
   a collection of "stable things that work together". 
   In contrast, branches within submodules are useful for doing all the 
   development that is *not* yet ready to be committed to the supermodule, 
   exactly because it's not yet been tested in the full "make World" kind 
   of situation.
> Whenever you do a checkout in the supermodule you also have to update
> the submodule and this update has to change the same thing which is read
> above.

I suspect (but will not guarantee) that the right approach is that a supermodule checkout usually just uses a "detached HEAD" setup. Within the context of the supermodule, only the actual commit SHA1 matters, not what branch it was developed on (side note: I haven't decided if we should allow the SHA1 to be a signed tag object too - the current patches obviously don't care since they never follow the SHA1 anyway, and it might be a good idea).

So I strongly suspect (and that is what the patch series embodies) that as far as the supermodule is concerned, it should *not* matter at all what branch the subproject was on. The subproject can use branches for development, and the supermodule really doesn't care what the local branchname was when a commit was made - because branch-names are *local* things, and a branch that is called "experimental" in one environment might be called "master" in another.

So once the commit hits the superproject, the branch identities just go away (only as far as the superproject is concerned, of course - the subproject still stays with whatever branches it has), and the only thing that matters is the commit SHA1.

> Updating the branch which HEAD points to is dangerous.

I would strongly suggest that the *superproject* never really change the status of the subproject HEAD, except it updates it for "pull/reset", and then it just would use whatever the subproject decided to use.

The subproject HEAD policy would be entirely under the control of the subproject. If the subproject wants to use a branch to track the superproject, go wild: have a real branch that is called "my-integration" and make HEAD a symref to that (and thus any work in the superproject will update that branch - something that is visible when you pull directly from that subproject!)

But quite often, I suspect that a subproject would just use a detached HEAD. The subproject may have branches of its own, of course, but you can think of HEAD as not being connected to any of it's "own" branches, but simply being the "superproject branch". That's a fairly accurate picture of reality, and using "detached HEAD" sounds like a very natural thing to do in that situation.

So I really think you can do both, and I think using HEAD inside the superproject gives you exactly that flexibility - you can decide on a per-subproject basis whether HEAD should track a real local branch in a subproject, or whether it should be detached.

(Side note: if you do *not* use detatched HEAD, I suspect the .gitmodules file could also contain the branchname to be used for the subproject tracking, but I think that's a detail, and quite debatable)

> So my advice is:
> Always read and write one dedicated branch (hardcoded "master" or
> configurable) when the supermodule wants to access a submodule.
So the main reasons I don't think that is a good idea are:
 - it's less flexible: see above on why you might want to use a dedicated 
   branch *or* just detached HEAD, and why you might want to choose your 
   own name for the dedicated branch.
 - it's also going to be quite confusing when the superproject sees 
   something *else* than what is actually checked out. This is an equally 
   strong argument for just using HEAD - when we actually implement a
	 git diff --subproject
   flag that recurses into the subproject, if you don't use HEAD inside 
   the subproject, that suddenly becomes a *very* confusing thing.

In other words, I really think HEAD is absolutely the right thing to use, but that said, I obviously wrote "resolve_gitlink_ref()" so that it can take any ref-name, and we *can* change that later, or make it a per-module config option or whatever.

		Linus
Previous: Martin WaitzNext: Sam Vilain
Message 75 of 98 in “Initial subproject support (RFC?)”
  1. 0/6 Initial subproject support (RFC?)Linus Torvalds, Apr 10, 2007
  2. 1/6 diff-lib: use ce_mode_from_stat() rather than messing with modes manuallyLinus Torvalds, Apr 10, 2007
  3. 2/6 Avoid overflowing name buffer in deep directory structuresLinus Torvalds, Apr 10, 2007
  4. 3/6 Add 'resolve_gitlink_ref()' helper functionLinus Torvalds, Apr 10, 2007
  5. Alex RiesenApr 10, 2007
  6. Linus TorvaldsApr 10, 2007
  7. Alex RiesenApr 10, 2007
  8. Linus TorvaldsApr 10, 2007
  9. Alex RiesenApr 10, 2007
  10. Linus TorvaldsApr 10, 2007
  11. Josef WeidendorferApr 10, 2007
  12. 4/6 Add "S_IFDIRLNK" file mode infrastructure for git linksLinus Torvalds, Apr 10, 2007
  13. 5/6 Teach "fsck" not to follow subproject linksLinus Torvalds, Apr 10, 2007
  14. Sam VilainApr 11, 2007
  15. Linus TorvaldsApr 11, 2007
  16. Sam VilainApr 11, 2007
  17. Linus TorvaldsApr 11, 2007
  18. David LangApr 11, 2007
  19. Linus TorvaldsApr 11, 2007
  20. David LangApr 11, 2007
  21. Linus TorvaldsApr 12, 2007
  22. Junio C HamanoApr 12, 2007
  23. David LangApr 12, 2007
  24. Dana HowApr 12, 2007
  25. Linus TorvaldsApr 12, 2007
  26. Rogan DawesApr 13, 2007
  27. Linus TorvaldsApr 13, 2007
  28. Dana HowApr 15, 2007
  29. Dana HowApr 12, 2007
  30. Sam VilainApr 12, 2007
  31. Junio C HamanoApr 12, 2007
  32. Linus TorvaldsApr 12, 2007
  33. Junio C HamanoApr 12, 2007
  34. Junio C HamanoApr 12, 2007
  35. Linus TorvaldsApr 12, 2007
  36. Dana HowApr 11, 2007
  37. 6/6 Teach core object handling functions about gitlinksLinus Torvalds, Apr 10, 2007
  38. Frank LichtenheldApr 10, 2007
  39. Alex RiesenApr 10, 2007
  40. Linus TorvaldsApr 10, 2007
  41. Josef WeidendorferApr 10, 2007
  42. Alex RiesenApr 10, 2007
  43. Josef WeidendorferApr 10, 2007
  44. Linus TorvaldsApr 10, 2007
  45. Andy ParkinsApr 10, 2007
  46. Linus TorvaldsApr 10, 2007
  47. Junio C HamanoApr 10, 2007
  48. Linus TorvaldsApr 10, 2007
  49. Sam VilainApr 12, 2007
  50. Martin WaitzApr 12, 2007
  51. Linus TorvaldsApr 12, 2007
  52. Sam VilainApr 12, 2007
  53. David LangApr 10, 2007
  54. Junio C HamanoApr 10, 2007
  55. Josef WeidendorferApr 10, 2007
  56. Linus TorvaldsApr 10, 2007
  57. Sam VilainApr 11, 2007
  58. Linus TorvaldsApr 12, 2007
  59. Torgil SvenssonApr 12, 2007
  60. Martin WaitzApr 12, 2007
  61. Torgil SvenssonApr 12, 2007
  62. Sam VilainApr 11, 2007
  63. Martin WaitzApr 11, 2007
  64. Alex RiesenApr 11, 2007
  65. Martin WaitzApr 11, 2007
  66. Alex RiesenApr 11, 2007
  67. Martin WaitzApr 11, 2007
  68. Junio C HamanoApr 11, 2007
  69. Martin WaitzApr 11, 2007
  70. Junio C HamanoApr 11, 2007
  71. Martin WaitzApr 11, 2007
  72. Linus TorvaldsApr 11, 2007
  73. Andy ParkinsApr 11, 2007
  74. Martin WaitzApr 11, 2007
  75. Linus TorvaldsApr 11, 2007
  76. Sam VilainApr 11, 2007
  77. Martin WaitzApr 11, 2007
  78. Brian GernhardtApr 12, 2007
  79. Josef WeidendorferApr 12, 2007
  80. Linus TorvaldsApr 10, 2007
  81. Alex RiesenApr 10, 2007
  82. Linus TorvaldsApr 10, 2007
  83. Alex RiesenApr 10, 2007
  84. Linus TorvaldsApr 10, 2007
  85. Alex RiesenApr 10, 2007
  86. Junio C HamanoApr 10, 2007
  87. Linus TorvaldsApr 10, 2007
  88. Junio C HamanoApr 10, 2007
  89. Sam RavnborgApr 10, 2007
  90. Junio C HamanoApr 10, 2007
  91. Nicolas PitreApr 10, 2007
  92. J. Bruce FieldsApr 15, 2007
  93. David KågedalApr 11, 2007
  94. Junio C HamanoApr 11, 2007
  95. J. Bruce FieldsApr 15, 2007
  96. Martin WaitzApr 11, 2007
  97. Alex RiesenApr 11, 2007
  98. Martin WaitzApr 11, 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.