Since v2, I replied to Peff's comments, and I also added support to propagate --no-single-branch. I'm pretty sure I followed the idiom right to to treat options as "yes, no, unset" but not sure of the best way to test to feel assured that they're being propagated correctly. - Emily Emily Shaffer (2): submodule--helper: use C99 named initializer clone: pass --single-branch during --recurse-submodules Documentation/git-submodule.txt | 6 +++++- builtin/clone.c | 5 +++++ builtin/submodule--helper.c | 32 +++++++++++++++++++++++------- git-submodule.sh | 10 +++++++++- t/t5617-clone-submodules-remote.sh | 13 +++++++++++- 5 files changed, 56 insertions(+), 10 deletions(-) -: ---------- > 1: d1d69cc9ce submodule--helper: use C99 named initializer 1: e064e805da ! 2: adfe55b18f clone: pass --single-branch during --recurse-submodules @@ Documentation/git-submodule.txt: If you really want to remove a submodule from t 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>] [--single-branch] [--] [<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 @@ Documentation/git-submodule.txt: options carefully. Clone new submodules in parallel with as many jobs. Defaults to the `submodule.fetchJobs` option. -+--single-branch:: ++--[no-]single-branch:: + This option is only valid for the update command. -+ Clone only one branch during update, HEAD or --branch. ++ Clone only one branch during update: HEAD or one specified by --branch. + <path>...:: Paths to submodule(s). When specified this will restrict the command @@ builtin/clone.c: static int checkout(int submodule_progress) argv_array_push(&args, "--no-fetch"); } -+ if (option_single_branch) -+ argv_array_push(&args, "--single-branch"); ++ 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); @@ builtin/submodule--helper.c: static int clone_submodule(const char *path, const argv_array_push(&cp.args, "--dissociate"); if (gitdir && *gitdir) argv_array_pushl(&cp.args, "--separate-git-dir", gitdir, NULL); -+ if (single_branch) -+ argv_array_push(&cp.args, "--single-branch"); ++ 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); @@ builtin/submodule--helper.c: static int module_clone(int argc, const char **argv struct string_list reference = STRING_LIST_INIT_NODUP; int dissociate = 0, require_init = 0; char *sm_alternate = NULL, *error_strategy = NULL; -+ int single_branch = 0; ++ int single_branch = -1; struct option module_clone_options[] = { OPT_STRING(0, "prefix", &prefix, @@ builtin/submodule--helper.c: struct submodule_update_clone { /* to be consumed by git-submodule.sh */ struct update_clone_data *update_clone; @@ builtin/submodule--helper.c: struct submodule_update_clone { - }; - #define SUBMODULE_UPDATE_CLONE_INIT {0, MODULE_LIST_INIT, 0, \ - SUBMODULE_UPDATE_STRATEGY_INIT, 0, 0, -1, STRING_LIST_INIT_DUP, 0, 0, \ -- NULL, NULL, NULL, \ -+ NULL, NULL, NULL, 0,\ - NULL, 0, 0, 0, NULL, 0, 0, 1} - - + .update = SUBMODULE_UPDATE_STRATEGY_INIT, \ + .recommend_shallow = -1, \ + .references = STRING_LIST_INIT_DUP, \ ++ .single_branch = -1, \ + .max_jobs = 1 \ + } + +- + static void next_submodule_warn_missing(struct submodule_update_clone *suc, + struct strbuf *out, const char *displaypath) + { @@ builtin/submodule--helper.c: 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) -+ argv_array_push(&child->args, "--single-branch"); ++ if (suc->single_branch >= 0) ++ argv_array_push(&child->args, suc->single_branch ? ++ "--single-branch" : ++ "--no-single-branch"); cleanup: strbuf_reset(&displaypath_sb); @@ git-submodule.sh: USAGE="[--quiet] [--cached] 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] [--single-branch] [--] [<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>...] @@ git-submodule.sh: cmd_update() jobs=$1 ;; + --single-branch) -+ single_branch=1 ++ single_branch="--single-branch" ++ ;; ++ --no-single-branch) ++ single_branch="--no-single-branch" + ;; --) shift @@ git-submodule.sh: cmd_update() ${dissociate:+"--dissociate"} \ ${depth:+--depth "$depth"} \ ${require_init:+--require-init} \ -+ ${single_branch:+--single-branch} \ ++ $single_branch \ $recommend_shallow \ $jobs \ -- \ @@ t/t5617-clone-submodules-remote.sh: test_expect_success 'check the default is -- + git clone --recurse-submodules --single-branch "file://$pwd/." super_clone && + ( + cd super_clone/sub && -+ git branch -a >branches && -+ test_must_fail grep other branches ++ git rev-parse --verify origin/master && ++ test_must_fail git rev-parse --verify origin/other + ) +' + -- 2.25.0.265.gbab2e86ba0-goog