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

Re: [RFC/PATCH 0/7] Rework git core for native submodules

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Apr 8, 2013, 16:08 UTC
Message-ID
<CALkWK0=2T5BA8+dro8U7bcp3ODsuQAj78mEPnxs=ERqf9FhSBQ@mail.gmail.com>
In-Reply-To
<7v1ual12pj.fsf@alter.siamese.dyndns.org>
Junio C Hamano wrote:
> Would it be possible that (at least some part of, or possibly all
> of) your ideas had some merit, but with all your hostility against
> the current system and the work that went behind it, you did not
> communicate well enough to make others understand you?

Agreed. My annoyance with the current system did go a little overboard, and I've been having a splitting headache for the last few days.

Show 16 quoted lines
> What I found very hard to read in this thread was that your messages
> all went like this:
>
>  1. In the current system, I have to be at the top level of a
>     submodule to work in it (or some other problems).
>
>  2. I will fix it in a more "elegant" way.
>
>  3. I have to have a new object at the submodule path, not the
>     current "submodule is a commit bound at the submodule path, and
>     information about the submodule is in .gitmodules".
>
> There was very little concrete explanation on how #3 leads to #2,
> i.e. the overall design of your new system and how it will work,
> other than you would read what we currently write in .gitmodules
> from a new kind of object.

I had no way of expressing what I wanted to do except by writing code when I started off this thread, but am in much better shape now. Let me try to explain my fundamental assumptions and code in a concise way now.

1. Having a toplevel .gitmodules means that any git-core command like
add/ rm/ mv will be burdened with looking for the .gitmodules at the
toplevel of the worktree and editing it appropriately along with
whatever it was built to do (ie. writing to the index and committing
it).  This is highly unnatural.  Putting the information in link
objects means that we get a more natural UI + warts like
cd-to-toplevel disappear with no extra code.
2. If we want to make git-submodule a part of git-core (which I think
everyone agrees with), we will need to make the information in
.gitmodules available more easily to the rest of git-core.  One way to
do it without breaking anything is to unpack the root tree, look for
an entry with the path .gitmodules and handle it different from other
blobs: ie. parse it into structured data that the rest of git-core can
consume.  However, I think it is very gross as the blob is not
inherently special in any way: it's just incidentally stored at a
specific tree path.  The alternative is to have an inherently special
kind of blob (ie. link object).  In the git-core code, I can simply
match for a link object and operate on it accordingly.  As opposed to
matching a blob object, and its tree path.  Moreover, this means that
the user can simply git edit-link <link> from anywhere in the worktree
instead of having to refer to the appropriate section in the toplevel
.gitmodules.
3. Currently diffing/ merging one huge .gitmodules file is a mess, as
it doesn't have to conform to a strict format.  This means that I can
get conflicts between these two:
    url = gh:artagnon/clayoven
    url =gh:artagnon/clayoven

Moreover, since the fields are not ordered, a simple reordering of the fields will cause a merge conflict. The correct way to fix this is to split up .gitmodules into many logical files, have a git edit-gitmodules which reduces user input to a strict format, and then write custom diff/merge drivers. My proposal involves having a git edit-link, and teaching git-core to diff/merge appropriately. The information is already in logical bits.

4. The only seeming disadvantage of not having a file accessible via
the filesystem is that it doesn't behave like a full blob.  But it
does; the code to unstage a link object (emulation) is actually very
simple: I'm currently writing it.
5. Having a first-class link object comes with functional advantages.
It means that I can have a ref pointing to link objects and easily
initialize a nested repository without having to initialize the
containing repository (ie. essentially replacing repo). We can have
true floating submodules, which is really nice in my opinion: you can
fix a library at v3.1 and switch it to v3.2 at some point in the
future without using ugly SHA-1 hexes anywhere.
6. While it is possible to work top-down from the current system, that
approach is clearly taking too long and is too painful.  This explains
why submodules haven't come a long way in the last five years.  With
my approach, I'm trying to make life simpler for everyone: it will
suddenly become much easier to hack on submodules, and it can improve
more rapidly over the next five years.  I'm not thinking about
short-term fixes precisely for this reason: the long-term goal is
worth a little bit of short-term inconvenience.
7. I estimate that replacing the current submodule system without
feature regressions will not take a lot of effort and can be done with
minimal breakages.  It's not a lot of code or anything very complex.
We just have to follow along the lines of how git-core handles blobs,
and write a little bit of code to make links behave like blobs (I'm
halfway done with this already).
Previous: Junio C HamanoNext: Junio C Hamano
Message 104 of 138 in “Rework git core for native submodules”
  1. 0/7 Rework git core for native submodulesRamkumar Ramachandra, Apr 4, 2013
  2. 1/7 link.c, link.h: introduce fifth object typeRamkumar Ramachandra, Apr 4, 2013
  3. 2/7 sha1_file, link: write link objects to the databaseRamkumar Ramachandra, Apr 4, 2013
  4. Ramkumar RamachandraApr 5, 2013
  5. Ramkumar RamachandraApr 5, 2013
  6. 3/7 teach ce_compare_gitlink() about OBJ_LINKRamkumar Ramachandra, Apr 4, 2013
  7. 4/7 builtin/log: teach show about OBJ_LINKRamkumar Ramachandra, Apr 4, 2013
  8. 5/7 edit-link: add new builtinRamkumar Ramachandra, Apr 4, 2013
  9. 6/7 clone: introduce clone.submodulegitdirRamkumar Ramachandra, Apr 4, 2013
  10. Ramkumar RamachandraApr 5, 2013
  11. 7/7 sha1_file: write ref_name to link objectRamkumar Ramachandra, Apr 4, 2013
  12. Ramkumar RamachandraApr 5, 2013
  13. Linus TorvaldsApr 4, 2013
  14. Ramkumar RamachandraApr 4, 2013
  15. Linus TorvaldsApr 4, 2013
  16. Junio C HamanoApr 4, 2013
  17. Ramkumar RamachandraApr 4, 2013
  18. Jens LehmannApr 4, 2013
  19. Ramkumar RamachandraApr 4, 2013
  20. Linus TorvaldsApr 4, 2013
  21. Ramkumar RamachandraApr 4, 2013
  22. Ramkumar RamachandraApr 4, 2013
  23. Ramkumar RamachandraApr 4, 2013
  24. Ramkumar RamachandraApr 4, 2013
  25. Jens LehmannApr 4, 2013
  26. Ramkumar RamachandraApr 4, 2013
  27. Junio C HamanoApr 4, 2013
  28. Ramkumar RamachandraApr 4, 2013
  29. Junio C HamanoApr 4, 2013
  30. Ramkumar RamachandraApr 4, 2013
  31. Junio C HamanoApr 4, 2013
  32. Ramkumar RamachandraApr 4, 2013
  33. Junio C HamanoApr 5, 2013
  34. Ramkumar RamachandraApr 5, 2013
  35. Ramkumar RamachandraApr 5, 2013
  36. Jonathan NiederApr 4, 2013
  37. Jonathan NiederApr 4, 2013
  38. Jonathan NiederApr 4, 2013
  39. Duy NguyenApr 8, 2013
  40. t3700 (add): add failing test for add with submodulesRamkumar Ramachandra, Apr 8, 2013
  41. Duy NguyenApr 8, 2013
  42. Junio C HamanoApr 8, 2013
  43. Jeff KingApr 8, 2013
  44. Junio C HamanoApr 8, 2013
  45. Jeff KingApr 8, 2013
  46. Ramkumar RamachandraApr 9, 2013
  47. 0/2 Fix git add with submodulesRamkumar Ramachandra, Apr 9, 2013
  48. 1/2 t3700 (add): add two tests for testing add with submodulesRamkumar Ramachandra, Apr 9, 2013
  49. 2/2 add: refuse to add paths beyond repository boundariesRamkumar Ramachandra, Apr 9, 2013
  50. Jeff KingApr 9, 2013
  51. Junio C HamanoApr 9, 2013
  52. Junio C HamanoApr 9, 2013
  53. Ramkumar RamachandraApr 9, 2013
  54. Junio C HamanoApr 9, 2013
  55. Ramkumar RamachandraApr 9, 2013
  56. Junio C HamanoApr 9, 2013
  57. Junio C HamanoApr 9, 2013
  58. Junio C HamanoApr 9, 2013
  59. Ramkumar RamachandraApr 10, 2013
  60. Junio C HamanoApr 10, 2013
  61. Junio C HamanoApr 9, 2013
  62. Ramkumar RamachandraApr 9, 2013
  63. Junio C HamanoApr 9, 2013
  64. Ramkumar RamachandraApr 10, 2013
  65. Jakub NarębskiApr 9, 2013
  66. Junio C HamanoApr 9, 2013
  67. Jakub NarębskiApr 9, 2013
  68. Junio C HamanoApr 9, 2013
  69. Jeff KingApr 9, 2013
  70. Jakub NarębskiApr 9, 2013
  71. Ramkumar RamachandraApr 9, 2013
  72. Jakub NarębskiApr 9, 2013
  73. Ramkumar RamachandraApr 6, 2013
  74. Junio C HamanoApr 7, 2013
  75. Ramkumar RamachandraApr 7, 2013
  76. Junio C HamanoApr 7, 2013
  77. Ramkumar RamachandraApr 7, 2013
  78. Ramkumar RamachandraApr 7, 2013
  79. John KeepingApr 7, 2013
  80. Ramkumar RamachandraApr 7, 2013
  81. John KeepingApr 7, 2013
  82. Ramkumar RamachandraApr 7, 2013
  83. John KeepingApr 7, 2013
  84. Ramkumar RamachandraApr 7, 2013
  85. John KeepingApr 7, 2013
  86. Jens LehmannApr 7, 2013
  87. Ramkumar RamachandraApr 7, 2013
  88. Jens LehmannApr 7, 2013
  89. Ramkumar RamachandraApr 7, 2013
  90. John KeepingApr 7, 2013
  91. Ramkumar RamachandraApr 7, 2013
  92. Ramkumar RamachandraApr 7, 2013
  93. Jonathan NiederApr 7, 2013
  94. Ramkumar RamachandraApr 7, 2013
  95. Jens LehmannApr 8, 2013
  96. Ramkumar RamachandraApr 8, 2013
  97. Jonathan NiederApr 8, 2013
  98. Ramkumar RamachandraApr 8, 2013
  99. Duy NguyenApr 8, 2013
  100. Ramkumar RamachandraApr 8, 2013
  101. Duy NguyenApr 8, 2013
  102. Ramkumar RamachandraApr 8, 2013
  103. Junio C HamanoApr 8, 2013
  104. Ramkumar RamachandraApr 8, 2013
  105. Junio C HamanoApr 8, 2013
  106. Ramkumar RamachandraApr 8, 2013
  107. Junio C HamanoApr 8, 2013
  108. Ramkumar RamachandraApr 8, 2013
  109. Junio C HamanoApr 8, 2013
  110. Ramkumar RamachandraApr 8, 2013
  111. Philip OakleyApr 10, 2013
  112. Ramkumar RamachandraApr 8, 2013
  113. Jakub NarębskiApr 9, 2013
  114. Ramkumar RamachandraApr 8, 2013
  115. Jonathan NiederApr 8, 2013
  116. Ramkumar RamachandraApr 8, 2013
  117. Junio C HamanoApr 8, 2013
  118. Junio C HamanoApr 8, 2013
  119. Duy NguyenApr 17, 2013
  120. Ramkumar RamachandraApr 17, 2013
  121. Duy NguyenApr 17, 2013
  122. Ramkumar RamachandraApr 17, 2013
  123. Duy NguyenApr 17, 2013
  124. Ramkumar RamachandraApr 17, 2013
  125. Philip OakleyApr 17, 2013
  126. Ramkumar RamachandraApr 18, 2013
  127. Jens LehmannApr 19, 2013
  128. Junio C HamanoApr 17, 2013
  129. Jens LehmannApr 8, 2013
  130. Jeff KingApr 8, 2013
  131. John KeepingApr 7, 2013
  132. Ramkumar RamachandraApr 7, 2013
  133. Ramkumar RamachandraApr 7, 2013
  134. Ramkumar RamachandraApr 7, 2013
  135. Ramkumar RamachandraApr 7, 2013
  136. Ramkumar RamachandraApr 7, 2013
  137. Ramkumar RamachandraApr 7, 2013
  138. Ramkumar RamachandraApr 8, 2013

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.