From: "Avery Pennarun" <apenwarr@gmail.com>
To: git@vger.kernel.org
Subject: git-submodule getting submodules from the parent repository
Date: Sat, 29 Mar 2008 18:35:59 -0400 [thread overview]
Message-ID: <32541b130803291535m317e84e6p321ebccd5dedaab3@mail.gmail.com> (raw)
Hi all,
I have a fairly pressing need for git-submodule-like behaviour, but
having tried git-submodule, it doesn't really work the way I'd like.
A super-simplified example of what I do:
- Project A (app) includes project B (build environment), which
includes project C (tool library)
- The projects are all open source, but B includes some binary
packages so it's a big download. If you don't need the binary
packages, people want to just download C (hence the separation). But
everyone using A wants B and C, because they're lazy and bandwidth
isn't a problem.
- We have a local repository at work with mirrors of A, B, and C,
which are also available publicly (but there's no reason for everyone
in our office to be uploading/downloading the same big blobs all the
time).
- We frequently change B and C as part of building A (as well as other
A-like applications).
Here are the main problems, all in a jumble:
It's a pain to check out / mirror / check in / push. git-submodule
doesn't even init automatically when you check out A, so you have to
run it yourself. The relative paths of A, B, and C on your mirror
have to be the same as upstream. You can't make a local mirror of A
without mirroring B and C. B and C start out with a disconnected
HEAD, so if you check in, it goes nowhere, and then when you push,
nothing happens, and if you're unlucky enough to pull someone else's
update to A and then "git-submodule update", it forgets your changes
entirely. When you check in to C, you then have to check in to B, and
then to A, all by hand; and when you git-pull, you'd better to C, then
B, then A, or risk having A try to check out a revision from B that
you haven't pulled, etc.
...phew.
It would probably be possible to fix each of these problems
individually, but it would be a whole series of different fixes. I'd
like to propose a rather different way of doing things that I think
would solve most of these problems, and get some feedback:
What if *all* the objects for A, B, and C were always in the *same*
repository? Almost all the problems would go away. Imagine if it
worked like this:
1. git-clone had a way to *not* clone every single object from every
branch in the parent repository; only the ones you were interested in.
So if you git-clone only project C, you don't end up with A and B. (I
personally would never need to clone A without B and C, but maybe
someone else would. It's actually a different implementation issue,
since A refers to B, but B doesn't refer to A.)
2. You still check into C, then B, then A, but it doesn't actually
matter if you put B and C on a branch first or not, because 'git push'
will work properly, because it auto-pushes B and C revisions based on
the fact that A refers to them (ie. implicit branches via the
submodule mechanism).
3. You can still upload B and C to their own separate upstream
repository, which is obviously a critical feature. But you can do
that simply by making a branch in your copy of C and pushing just that
branch. The objects come from your one local A repository, but you
simply avoid accidentally pushing the wrong branch.
4. You can 'git clone' a local copy of A, and B/C will be cloned
automatically along with it.
5. B and C, when git-submodule checks them out, should have their own
.git directories, but use A as an 'alternatives' entry.
6. git-pull should be modified to auto-download objects referred to by
'submodule' references in trees.
This would really help my workflow a lot. Am I missing something?
Thoughts?
Thanks,
Avery
next reply other threads:[~2008-03-29 22:36 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-29 22:35 Avery Pennarun [this message]
2008-03-29 23:22 ` git-submodule getting submodules from the parent repository Sam Vilain
2008-03-30 13:32 ` Eyvind Bernhardsen
2008-03-30 17:48 ` Sam Vilain
2008-03-30 19:50 ` Eyvind Bernhardsen
2008-03-30 20:19 ` Sam Vilain
2008-03-31 10:05 ` Eyvind Bernhardsen
2008-03-30 23:03 ` Avery Pennarun
2008-03-31 9:29 ` Eyvind Bernhardsen
2008-03-31 21:36 ` Avery Pennarun
2008-04-01 23:05 ` Sam Vilain
2008-04-01 23:56 ` Avery Pennarun
2008-04-02 0:35 ` Junio C Hamano
2008-04-02 2:03 ` Avery Pennarun
2008-04-02 20:06 ` Sam Vilain
2008-04-02 21:32 ` Junio C Hamano
2008-03-30 23:00 ` Avery Pennarun
2008-04-01 23:10 ` Sam Vilain
2008-03-31 6:22 ` Johannes Sixt
2008-03-31 21:24 ` Avery Pennarun
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=32541b130803291535m317e84e6p321ebccd5dedaab3@mail.gmail.com \
--to=apenwarr@gmail.com \
--cc=git@vger.kernel.org \
/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.
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 NNTP newsgroup(s).