From: "Shawn O. Pearce" <spearce@spearce.org>
To: Junio C Hamano <junkio@cox.net>
Cc: Alex Riesen <raa.lkml@gmail.com>, skimo@liacs.nl, git@vger.kernel.org
Subject: Re: [PATCH 07/16] git-read-tree: take --submodules option
Date: Sat, 19 May 2007 00:27:57 -0400 [thread overview]
Message-ID: <20070519042757.GD3141@spearce.org> (raw)
In-Reply-To: <7vd50x1n0r.fsf@assigned-by-dhcp.cox.net>
Junio C Hamano <junkio@cox.net> wrote:
> Now, suppose "git checkout" needs to recurse into one
> subdirectory that is to have a subproject. There are three
> cases:
So I've implemented my own Git subproject support in a Java based
tool we use internally. Its actually driving the Git plumbing (as
JGit isn't complete enough to do the job) but applies quite a bit
to this discussion as it is a working system that implements this
"checkout in superproject and recurse into subproject".
First I don't use the subproject support in the core plumbing,
because that came along from Linus about 2 days after I wrote
this implementation. Our data file looks like:
use-component: subproject1 >=df8cfac815...
use-component: subproject2 >=af9b543820...
Or really anything that is a valid commit-ish, and often these are
actually just annotated tag names.
> (1) There is no git repository yet (the plumbing layer already
> makes sure there is a directory, but does not do anything
> else).
During our build process we scan the root project's data file,
and clone by the relative URL anything we cannot find locally:
$(git config remote.origin.url)/../component-links/subproject1.git
to get the subproject repository. We don't require that the
subproject1 directory actually be called subproject1 in the
superproject, its just a recommendation. That data file is also
our build-system driver and the build system driver is pretty darn
smart about guessing what is going on. ;-)
You'll notice however that we (more or less) have a very flat
structure. The component-links directory is really just a set of
symlinks pointing back up a level, as sometimes a component is not
stored in a repository named the component name, but the component
name matters to the build system.
> (2) There already is a git repository there, which is the
> correct repository (perhaps determined by .gitmodules and
> .git/config in the superproject, or presense of the commit
> that is recorded in the superproject's index).
>
> (3) There is a git repository but it is not the correct one.
>
> For case (2), I think what should happen there is an equivalent
> of this:
>
> $ commit=$(git-rev-parse :subproject)
> $ cd subproject
> $ git-rev-parse --verify $commit || git fetch || barf
> $ git checkout $commit
Yes. Except we do a few things differently:
- Only update the subproject if its a strict fast-forward.
- Abort on a dirty working directory in the subproject or if a merge
would be required to keep the current commit and the new commit.
Yes, we don't really support going "backwards".
- The merge aborting thing is probably wrong for some users,
but blindly switching to the target commit feels somewhat wrong
in our own uses. Sometimes you need the current version of the
subproject to help you debug an older version of the superproject,
or sibling subproject.
- You can't just checkout $commit if you can rev-parse it.
You need to verify it and its entire reachable object set exists.
See the local fetch fast-path thing you did recently in e3c6f240fd.
- We update the user's current branch. Because we are doing
a strict fast-forward we're also assuming the user wants the
current branch to stay correlated to the superproject branch. Why?
Most of our users keep the same branch name in all repositories.
--
Shawn.
next prev parent reply other threads:[~2007-05-19 4:28 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-18 19:24 Second round of support for cloning submodules skimo
2007-05-18 19:24 ` [PATCH 01/16] Add dump-config skimo
2007-05-18 19:24 ` [PATCH 02/16] git-config: add --remote option for reading config from remote repo skimo
2007-05-18 19:24 ` [PATCH 03/16] http.h: make fill_active_slots a function pointer skimo
2007-05-18 19:24 ` [PATCH 04/16] git-config: read remote config files over HTTP skimo
2007-05-18 19:24 ` [PATCH 05/16] unpack-trees.c: verify_uptodate: remove dead code skimo
2007-05-18 22:33 ` Junio C Hamano
2007-05-18 19:24 ` [PATCH 06/16] unpack-trees.c: pass cache_entry * to verify_absent rather than just the name skimo
2007-05-18 19:24 ` [PATCH 07/16] git-read-tree: take --submodules option skimo
2007-05-18 21:53 ` Alex Riesen
2007-05-18 22:08 ` Sven Verdoolaege
2007-05-18 22:42 ` Alex Riesen
2007-05-19 3:59 ` Junio C Hamano
2007-05-19 4:27 ` Shawn O. Pearce [this message]
2007-05-19 9:19 ` Alex Riesen
2007-05-19 13:05 ` Sven Verdoolaege
2007-05-19 18:20 ` Junio C Hamano
2007-05-20 15:54 ` Jan Hudec
2007-05-20 18:33 ` Junio C Hamano
2007-05-20 20:22 ` Sven Verdoolaege
2007-05-21 16:59 ` Jan Hudec
2007-05-21 18:05 ` Sven Verdoolaege
2007-05-21 19:01 ` Junio C Hamano
2007-05-21 20:02 ` Jan Hudec
2007-05-21 21:11 ` Martin Waitz
2007-05-22 19:37 ` Jan Hudec
2007-05-24 15:48 ` Martin Waitz
2007-05-25 10:06 ` Jakub Narebski
2007-05-25 20:15 ` Jan Hudec
2007-05-24 18:26 ` Junio C Hamano
2007-05-24 18:45 ` Sven Verdoolaege
2007-05-24 18:58 ` Junio C Hamano
2007-05-24 19:14 ` Sven Verdoolaege
2007-05-24 20:32 ` Junio C Hamano
2007-05-24 20:55 ` Petr Baudis
2007-05-24 20:59 ` Junio C Hamano
2007-05-24 19:43 ` Junio C Hamano
2007-05-24 20:57 ` Petr Baudis
2007-05-25 20:35 ` Jan Hudec
2007-05-25 21:05 ` Junio C Hamano
2007-05-25 21:16 ` Steven Grimm
2007-05-25 22:11 ` Junio C Hamano
2007-05-19 0:34 ` Petr Baudis
2007-05-18 19:24 ` [PATCH 08/16] unpack-trees.c: assume submodules are clean skimo
2007-05-18 19:24 ` [PATCH 09/16] entry.c: optionally checkout submodules skimo
2007-05-18 21:56 ` Alex Riesen
2007-05-18 22:03 ` Sven Verdoolaege
2007-05-18 22:33 ` Alex Riesen
2007-05-18 22:00 ` Alex Riesen
2007-05-18 22:20 ` [PATCH] Add run_command_v_opt_cd: chdir into a directory before exec Alex Riesen
2007-05-18 22:48 ` [PATCH] Use run_command_v_opt_cd when checking out a submodule Alex Riesen
2007-05-18 19:24 ` [PATCH 10/16] git-checkout: pass --submodules option to git-read-tree skimo
2007-05-19 0:36 ` Petr Baudis
2007-05-18 19:25 ` [PATCH 11/16] git-fetch: skip empty arguments skimo
2007-05-18 22:33 ` Junio C Hamano
2007-05-18 19:25 ` [PATCH 12/16] builtin-fetch--tool: extend "native-store" for use in cloning skimo
2007-05-18 22:52 ` Alex Riesen
2007-05-19 12:17 ` Sven Verdoolaege
2007-05-18 19:25 ` [PATCH 13/16] git-clone: rely on git-fetch for fetching for most protocols skimo
2007-05-18 19:25 ` [PATCH 14/16] git-clone: rely on git-fetch for non-bare fetching over http skimo
2007-05-18 19:25 ` [PATCH 15/16] git-read-tree: treat null commit as empty tree skimo
2007-05-18 19:25 ` [PATCH 16/16] git-clone: add --submodules for cloning submodules skimo
2007-05-18 19:34 ` Second round of support " Sven Verdoolaege
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=20070519042757.GD3141@spearce.org \
--to=spearce@spearce.org \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
--cc=raa.lkml@gmail.com \
--cc=skimo@liacs.nl \
/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).