From: Junio C Hamano <gitster@pobox.com>
To: Stefan Beller <sbeller@google.com>
Cc: Lars Schneider <larsxschneider@gmail.com>,
Brandon Williams <bmwill@google.com>,
"git\@vger.kernel.org" <git@vger.kernel.org>
Subject: Re: Submodule regression in 2.14?
Date: Fri, 18 Aug 2017 23:51:13 -0700 [thread overview]
Message-ID: <xmqqpobs9hjy.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <CAGZ79kap-4k7n48dvBAv2pJjNy2s_LPHS-NdfQD0A-BbWqh4aQ@mail.gmail.com> (Stefan Beller's message of "Fri, 18 Aug 2017 12:09:53 -0700")
Stefan Beller <sbeller@google.com> writes:
> Jonathan brought up the following very long term vision:
> Eventually the everyday git commands do not treat submodules
> any special than trees, even the submodules git directory
> may be non existent (everything is absorbed into the superproject);
> so it really feels like a monorepo.
That may be one valid option to have but I do not see a reason why
it needs to be the only valid option. So I do not see why you are
bringing it up in this thread.
But that is a good starting point to discuss one possible future.
Let's think aloud how that world would look like.
* When you "git clone" a superproject (perhaps implicitly with the
"--recurse-submodules" option), the top-level project and all of
its submodules will be checked out on the same branch (presumably
the 'master' branch, which is the default).
* Your attempt to "git commit", "git branch", "git checkout -b",
etc. inside a submodule will either fail, or will implicitly
chdir up to the top-level superproject and turn into the
corresponding command with "--recurse-submodules".
* "git commit --recurse-submodules -a" from the top-level will grab
all the local changes, depth-first and recursively, in
submodules, makes a commit, binds the new commit to the index of
the superproject that immediately contains the submodule and
makes a commit in it, until it percolates all the way up to the
superproject. When working in this mode, branches in submodules
do not really matter; the gitlink in the superproject is the only
thing that matters.
* It naturally follows that between two adjacent commits C and C~1
in the superproject's history, the commit in a submodule bound to
C and the commit in a submodule bound to C~1 are either the same
(i.e. superproject made a commit but there was no change in the
submodule), or they are in direct parent-child relationship
(i.e. the local changes made to the submodule was recorded as a
single commit when the superproject made the commit).
* "git push --recurse-submodules" from the top-level will push the
history of the superproject out, together with the history of the
submodules.
I think it is doable, but a mechanism to enumerate all the commits
bound from submodules to a range of superproject's commits needs to
be invented to drive the pack-objects for efficient object transfer.
Having it would also help in fsck and gc---as branches are immaterial
in the submodule repositories, commits in superprojects that are
reachable from refs will have to serve as the connectivity anchors
for commit DAG in the submodule histories.
As long as we are talking about idealized future world (well, at
least an idea of somebody's "ideal", not necessarily shared by
everybody), I wonder if there is even any need to have commits in
submodules in such a world. To realize such a "monorepo" world, you
might be better off allowing a gitlink in the superproject to
directly point at a tree object in a submodule repository (making
them physically a single repository is an optional implementation
detail I choose to ignore in this discussion).
next prev parent reply other threads:[~2017-08-19 6:51 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-16 18:35 Submodule regression in 2.14? Lars Schneider
2017-08-16 18:51 ` Stefan Beller
2017-08-16 18:53 ` Stefan Beller
2017-08-17 21:21 ` Lars Schneider
2017-08-17 21:55 ` Stefan Beller
2017-08-18 2:13 ` Junio C Hamano
2017-08-18 4:02 ` Stefan Beller
2017-08-18 16:50 ` Junio C Hamano
2017-08-18 19:09 ` Stefan Beller
2017-08-19 6:51 ` Junio C Hamano [this message]
2017-08-21 16:05 ` Heiko Voigt
2017-08-21 16:42 ` Stefan Beller
2017-08-22 15:33 ` Heiko Voigt
2017-08-22 18:10 ` Stefan Beller
2017-08-25 9:10 ` Heiko Voigt
2017-08-25 16:38 ` Stefan Beller
2017-08-25 16:53 ` Junio C Hamano
2017-08-21 16:48 ` Junio C Hamano
2017-08-22 15:50 ` Heiko Voigt
2017-08-21 16:46 ` Stefan Beller
2017-08-21 22:45 ` Junio C Hamano
2017-08-18 13:12 ` Lars Schneider
2017-08-18 17:16 ` Stefan Beller
2017-08-18 19:10 ` Junio C Hamano
2017-08-18 22:04 ` [PATCH] pull: respect submodule update configuration Stefan Beller
2017-08-18 22:05 ` Stefan Beller
2017-08-19 6:17 ` Junio C Hamano
2017-08-19 6:24 ` Junio C Hamano
2017-08-21 16:20 ` Heiko Voigt
2017-08-21 16:55 ` Stefan Beller
2017-08-21 17:20 ` Lars Schneider
2017-08-21 17:48 ` Stefan Beller
2017-08-21 18:21 ` Brandon Williams
2017-08-21 22:52 ` Junio C Hamano
2017-08-22 14:50 ` Lars Schneider
2017-08-22 17:51 ` Stefan Beller
2017-08-22 18:55 ` Brandon Williams
2017-08-19 18:24 ` Submodule regression in 2.14? Lars Schneider
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqpobs9hjy.fsf@gitster.mtv.corp.google.com \
--to=gitster@pobox.com \
--cc=bmwill@google.com \
--cc=git@vger.kernel.org \
--cc=larsxschneider@gmail.com \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).