]> git.ipfire.org Git - thirdparty/git.git/commitdiff
clone: pass --single-branch during --recurse-submodules
authorEmily Shaffer <emilyshaffer@google.com>
Fri, 21 Feb 2020 03:10:27 +0000 (19:10 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 25 Feb 2020 18:00:38 +0000 (10:00 -0800)
Previously, performing "git clone --recurse-submodules --single-branch"
resulted in submodules cloning all branches even though the superproject
cloned only one branch. Pipe --single-branch through the submodule
helper framework to make it to 'clone' later on.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-submodule.txt
builtin/clone.c
builtin/submodule--helper.c
git-submodule.sh
t/t5617-clone-submodules-remote.sh

index 5232407f68331618e5c509b91aef30ce6c6dbecd..cbe60b11ee04f6a4d86f42cb7f159d5e535f8513 100644 (file)
@@ -133,7 +133,7 @@ If you really want to remove a submodule from the repository and commit
 that use linkgit:git-rm[1] instead. See linkgit:gitsubmodules[7] for removal
 options.
 
-update [--init] [--remote] [-N|--no-fetch] [--[no-]recommend-shallow] [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>] [--depth <depth>] [--recursive] [--jobs <n>] [--] [<path>...]::
+update [--init] [--remote] [-N|--no-fetch] [--[no-]recommend-shallow] [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>] [--depth <depth>] [--recursive] [--jobs <n>] [--[no-]single-branch] [--] [<path>...]::
 +
 --
 Update the registered submodules to match what the superproject
@@ -430,6 +430,10 @@ options carefully.
        Clone new submodules in parallel with as many jobs.
        Defaults to the `submodule.fetchJobs` option.
 
+--[no-]single-branch::
+       This option is only valid for the update command.
+       Clone only one branch during update: HEAD or one specified by --branch.
+
 <path>...::
        Paths to submodule(s). When specified this will restrict the command
        to only operate on the submodules found at the specified paths.
index 0fc89ae2b9c77d420153c8bef6680d3324cdf5ad..9a02ac5b0b27a2664b965be0186d9fa3967059e7 100644 (file)
@@ -832,6 +832,11 @@ static int checkout(int submodule_progress)
                        argv_array_push(&args, "--no-fetch");
                }
 
+               if (option_single_branch >= 0)
+                       argv_array_push(&args, option_single_branch ?
+                                              "--single-branch" :
+                                              "--no-single-branch");
+
                err = run_command_v_opt(args.argv, RUN_GIT_CMD);
                argv_array_clear(&args);
        }
index ea858385565e0f3f121c3563b6de6d79fe8c7096..cfa190b24549798b349ceca7f5c862a2aa770456 100644 (file)
@@ -1225,7 +1225,7 @@ static int module_deinit(int argc, const char **argv, const char *prefix)
 
 static int clone_submodule(const char *path, const char *gitdir, const char *url,
                           const char *depth, struct string_list *reference, int dissociate,
-                          int quiet, int progress)
+                          int quiet, int progress, int single_branch)
 {
        struct child_process cp = CHILD_PROCESS_INIT;
 
@@ -1247,6 +1247,10 @@ static int clone_submodule(const char *path, const char *gitdir, const char *url
                argv_array_push(&cp.args, "--dissociate");
        if (gitdir && *gitdir)
                argv_array_pushl(&cp.args, "--separate-git-dir", gitdir, NULL);
+       if (single_branch >= 0)
+               argv_array_push(&cp.args, single_branch ?
+                                         "--single-branch" :
+                                         "--no-single-branch");
 
        argv_array_push(&cp.args, "--");
        argv_array_push(&cp.args, url);
@@ -1373,6 +1377,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)
        struct string_list reference = STRING_LIST_INIT_NODUP;
        int dissociate = 0, require_init = 0;
        char *sm_alternate = NULL, *error_strategy = NULL;
+       int single_branch = -1;
 
        struct option module_clone_options[] = {
                OPT_STRING(0, "prefix", &prefix,
@@ -1400,12 +1405,15 @@ static int module_clone(int argc, const char **argv, const char *prefix)
                           N_("force cloning progress")),
                OPT_BOOL(0, "require-init", &require_init,
                           N_("disallow cloning into non-empty directory")),
+               OPT_BOOL(0, "single-branch", &single_branch,
+                        N_("clone only one branch, HEAD or --branch")),
                OPT_END()
        };
 
        const char *const git_submodule_helper_usage[] = {
                N_("git submodule--helper clone [--prefix=<path>] [--quiet] "
                   "[--reference <repository>] [--name <name>] [--depth <depth>] "
+                  "[--single-branch] "
                   "--url <url> --path <path>"),
                NULL
        };
@@ -1438,7 +1446,7 @@ static int module_clone(int argc, const char **argv, const char *prefix)
                prepare_possible_alternates(name, &reference);
 
                if (clone_submodule(path, sm_gitdir, url, depth, &reference, dissociate,
-                                   quiet, progress))
+                                   quiet, progress, single_branch))
                        die(_("clone of '%s' into submodule path '%s' failed"),
                            url, path);
        } else {
@@ -1562,6 +1570,7 @@ struct submodule_update_clone {
        const char *depth;
        const char *recursive_prefix;
        const char *prefix;
+       int single_branch;
 
        /* to be consumed by git-submodule.sh */
        struct update_clone_data *update_clone;
@@ -1581,6 +1590,7 @@ struct submodule_update_clone {
        .update = SUBMODULE_UPDATE_STRATEGY_INIT, \
        .recommend_shallow = -1, \
        .references = STRING_LIST_INIT_DUP, \
+       .single_branch = -1, \
        .max_jobs = 1, \
 }
 
@@ -1721,6 +1731,10 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
                argv_array_push(&child->args, "--dissociate");
        if (suc->depth)
                argv_array_push(&child->args, suc->depth);
+       if (suc->single_branch >= 0)
+               argv_array_push(&child->args, suc->single_branch ?
+                                             "--single-branch" :
+                                             "--no-single-branch");
 
 cleanup:
        strbuf_reset(&displaypath_sb);
@@ -1900,6 +1914,8 @@ static int update_clone(int argc, const char **argv, const char *prefix)
                            N_("force cloning progress")),
                OPT_BOOL(0, "require-init", &suc.require_init,
                           N_("disallow cloning into non-empty directory")),
+               OPT_BOOL(0, "single-branch", &suc.single_branch,
+                        N_("clone only one branch, HEAD or --branch")),
                OPT_END()
        };
 
index aaa1809d243c6671a9c6fc959d96bd366a65efec..2e3306495e09d68192c5f9db967a23c3ca3374c6 100755 (executable)
@@ -10,7 +10,7 @@ USAGE="[--quiet] [--cached]
    or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] init [--] [<path>...]
    or: $dashless [--quiet] deinit [-f|--force] (--all| [--] <path>...)
-   or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--] [<path>...]
+   or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] [--] [<path>...]
    or: $dashless [--quiet] set-branch (--default|--branch <branch>) [--] <path>
    or: $dashless [--quiet] set-url [--] <path> <newurl>
    or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
@@ -47,6 +47,7 @@ custom_name=
 depth=
 progress=
 dissociate=
+single_branch=
 
 die_if_unmatched ()
 {
@@ -526,6 +527,12 @@ cmd_update()
                --jobs=*)
                        jobs=$1
                        ;;
+               --single-branch)
+                       single_branch="--single-branch"
+                       ;;
+               --no-single-branch)
+                       single_branch="--no-single-branch"
+                       ;;
                --)
                        shift
                        break
@@ -555,6 +562,7 @@ cmd_update()
                ${dissociate:+"--dissociate"} \
                ${depth:+--depth "$depth"} \
                ${require_init:+--require-init} \
+               $single_branch \
                $recommend_shallow \
                $jobs \
                -- \
index 37fcce9c40c98f55f76f01bf38ca575f7c246d09..1a041df10bee558bf4b643f42d4ffa876fefbc14 100755 (executable)
@@ -14,7 +14,8 @@ test_expect_success 'setup' '
                cd sub &&
                git init &&
                test_commit subcommit1 &&
-               git tag sub_when_added_to_super
+               git tag sub_when_added_to_super &&
+               git branch other
        ) &&
        git submodule add "file://$pwd/sub" sub &&
        git commit -m "add submodule" &&
@@ -51,4 +52,14 @@ test_expect_success 'check the default is --no-remote-submodules' '
        )
 '
 
+test_expect_success 'clone with --single-branch' '
+       test_when_finished "rm -rf super_clone" &&
+       git clone --recurse-submodules --single-branch "file://$pwd/." super_clone &&
+       (
+               cd super_clone/sub &&
+               git rev-parse --verify origin/master &&
+               test_must_fail git rev-parse --verify origin/other
+       )
+'
+
 test_done