> On 16 Mar 2016, at 02:12, Stefan Beller <sbel...@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/


> 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 <sbel...@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...


> +     `--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." ?


> +
> --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?

  
>       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
> 

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to