Re: [PATCH 1/3] clone: add `--shallow-submodules` flag
- From
Lars Schneider <larsxschneider@gmail.com>
- Date
- Apr 25, 2016, 11:50 UTC
- Message-ID
- <DC38BBF1-9837-45C6-B744-F95FAA645FE3@gmail.com>
- In-Reply-To
- <1458090737-14030-2-git-send-email-sbeller@google.com>
Show 27 quoted lines
> On 16 Mar 2016, at 02:12, Stefan Beller <sbeller@google.com> wrote: > > When creating a shallow clone of a repository with submodules, the depth > argument does not influence the submodules, i.e. the submodules are done > as non-shallow clones. It is unclear what the best default is for the > depth of submodules of a shallow clone, so we need to have the possibility > to do all kinds of combinations: > > * shallow super project with shallow submodules > e.g. build bots starting always from scratch. They want to transmit > the least amount of network data as well as using the least amount > of space on their hard drive. > * shallow super project with unshallow submodules > e.g. The superproject is just there to track a collection of repositories > and it is not important to have the relationship between the repositories > intact. However the history of the individual submodules matter. > * unshallow super project with shallow submodules > e.g. The superproject is the actual project and the submodule is a > library which is rarely touched. > > The new switch to select submodules to be shallow or unshallow supports > all of these three cases. > > It is easy to transition from the first to the second case by just > unshallowing the submodules (`git submodule foreach git fetch > --unshallow`), but it is not possible to transition from the second to the > first case (as we wouldd have already transmitted the non shallow over
s/wouldd/would/
Show 35 quoted lines
> the network). That is why we want to make the first case the default in > case of a shallow super project. This leads to the inconvenience in the > second case with the shallow super project and unshallow submodules, > as you need to pass `--no-shallow-submodules`. > > Signed-off-by: Stefan Beller <sbeller@google.com> > --- > Documentation/git-clone.txt | 13 ++++++++++--- > builtin/clone.c | 7 +++++++ > 2 files changed, 17 insertions(+), 3 deletions(-) > > diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt > index 6db7b6d..20a4577 100644 > --- a/Documentation/git-clone.txt > +++ b/Documentation/git-clone.txt > @@ -14,8 +14,8 @@ SYNOPSIS > [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>] > [--dissociate] [--separate-git-dir <git dir>] > [--depth <depth>] [--[no-]single-branch] > - [--recursive | --recurse-submodules] [--jobs <n>] [--] <repository> > - [<directory>] > + [--recursive | --recurse-submodules] [--[no-]shallow-submodules] > + [--jobs <n>] [--] <repository> [<directory>] > > DESCRIPTION > ----------- > @@ -190,7 +190,11 @@ objects from the source repository into a pack in the cloned repository. > > --depth <depth>:: > Create a 'shallow' clone with a history truncated to the > - specified number of revisions. > + specified number of revisions. Implies `--single-branch` unless > + `--no-single-branch` is given to fetch the histories near the > + tips of all branches. This implies `--shallow-submodules`. If > + you want to have a shallow clone, but full submodules, also pass
Can we make this more explicit. Attention, bikeshedding: If you want to have a shallow parent clone, but full submodules...
Show 9 quoted lines
> + `--no-shallow-submodules`. > > --[no-]single-branch:: > Clone only the history leading to the tip of a single branch, > @@ -214,6 +218,9 @@ objects from the source repository into a pack in the cloned repository. > repository does not have a worktree/checkout (i.e. if any of > `--no-checkout`/`-n`, `--bare`, or `--mirror` is given) > > +--shallow-submodules::
Should that be "--[no-]shallow-submodules" ?
> + All submodules which are cloned, will be shallow.
Maybe you could extend it with "... will be shallow with a depth of 1." ?
Show 22 quoted lines
> +
> --separate-git-dir=<git dir>::
> Instead of placing the cloned repository where it is supposed
> to be, place the cloned repository at the specified directory,
> diff --git a/builtin/clone.c b/builtin/clone.c
> index b004fb4..ecdf308 100644
> --- a/builtin/clone.c
> +++ b/builtin/clone.c
> @@ -40,6 +40,7 @@ static const char * const builtin_clone_usage[] = {
>
> static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1;
> static int option_local = -1, option_no_hardlinks, option_shared, option_recursive;
> +static int option_shallow_submodules = -1;
> static char *option_template, *option_depth;
> static char *option_origin = NULL;
> static char *option_branch = NULL;
> @@ -91,6 +92,8 @@ static struct option builtin_clone_options[] = {
> N_("create a shallow clone of that depth")),
> OPT_BOOL(0, "single-branch", &option_single_branch,
> N_("clone only one branch, HEAD or --branch")),
> + OPT_BOOL(0, "shallow-submodules", &option_shallow_submodules,
> + N_("any cloned submodules will be shallow")),I am not familiar with this code but I assume the "no-" prefix flips the bool?
Show 17 quoted lines
> OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
> N_("separate git dir from working tree")),
> OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
> @@ -727,6 +730,10 @@ static int checkout(void)
> struct argv_array args = ARGV_ARRAY_INIT;
> argv_array_pushl(&args, "submodule", "update", "--init", "--recursive", NULL);
>
> + if (option_shallow_submodules == 1
> + || (option_shallow_submodules == -1 && option_depth))
> + argv_array_push(&args, "--depth=1");
> +
> if (max_jobs != -1)
> argv_array_pushf(&args, "--jobs=%d", max_jobs);
>
> --
> 2.7.0.rc0.42.g8e9204f.dirty
>