Re: [PATCH 1/3] clone: add `--shallow-submodules` flag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> On 16 Mar 2016, at 02:12, Stefan Beller <sbeller@xxxxxxxxxx> 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 <sbeller@xxxxxxxxxx>
> ---
> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]