Brandon Williams <bmwill@xxxxxxxxxx> writes: > The new switch passes the pathspec to `git submodule update > --init-active` which is called after the actual clone is done. > > Additionally this configures the submodule.active option to > be the given pathspec, such that any future invocation of > `git submodule update --init-active` will keep up > with the pathspec. > > Based on a patch by Stefan Beller <sbeller@xxxxxxxxxx> > > Signed-off-by: Brandon Williams <bmwill@xxxxxxxxxx> > --- > Documentation/git-clone.txt | 23 ++++++++++----- > builtin/clone.c | 36 +++++++++++++++++++++-- > t/t7400-submodule-basic.sh | 70 +++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 120 insertions(+), 9 deletions(-) > > diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt > index 35cc34b2f..9692eab30 100644 > --- a/Documentation/git-clone.txt > +++ b/Documentation/git-clone.txt > @@ -15,7 +15,8 @@ SYNOPSIS > [--dissociate] [--separate-git-dir <git dir>] > [--depth <depth>] [--[no-]single-branch] > [--recursive | --recurse-submodules] [--[no-]shallow-submodules] > - [--jobs <n>] [--] <repository> [<directory>] > + [--submodule-spec <pathspec>] [--jobs <n>] [--] > + <repository> [<directory>] Hmph. Can we then make "--recurse-submodules" an obsolete way to spell "--submodule-spec ."? I am not actively suggesting to deprecate it; I am trying to see if there are semantic differences between the two. I am also wondering "--recurse-submodules=<pathspec>" would be a better UI, instead of introducing yet another option. > @@ -217,12 +218,20 @@ objects from the source repository into a pack in the cloned repository. > > --recursive:: > --recurse-submodules:: > - After the clone is created, initialize all submodules within, > - using their default settings. This is equivalent to running > - `git submodule update --init --recursive` immediately after > - the clone is finished. This option is ignored if the cloned > - repository does not have a worktree/checkout (i.e. if any of > - `--no-checkout`/`-n`, `--bare`, or `--mirror` is given) > + After the clone is created, initialize and clone all submodules > + within, using their default settings. This is equivalent to > + running `git submodule update --recursive --init` immediately > + after the clone is finished. This option is ignored if the > + cloned repository does not have a worktree/checkout (i.e. if > + any of `--no-checkout`/`-n`, `--bare`, or `--mirror` is given) With reflowing it is unnecessarily harder to spot what got changed. "and clone" is inserted, "--init" and "--recursive" were swapped. Any other changes? > diff --git a/builtin/clone.c b/builtin/clone.c > index 3f63edbbf..c6731379b 100644 > --- a/builtin/clone.c > +++ b/builtin/clone.c > @@ -56,6 +56,16 @@ static struct string_list option_required_reference = STRING_LIST_INIT_NODUP; > static struct string_list option_optional_reference = STRING_LIST_INIT_NODUP; > static int option_dissociate; > static int max_jobs = -1; > +static struct string_list submodule_spec; > + > +static int submodule_spec_cb(const struct option *opt, const char *arg, int unset) > +{ > + if (unset) > + return -1; > + > + string_list_append((struct string_list *)opt->value, arg); > + return 0; > +} Hmph, doesn't OPT_STRING_LIST work for this thing? > + if (submodule_spec.nr > 0) { > + struct string_list_item *item; > + struct strbuf sb = STRBUF_INIT; > + for_each_string_list_item(item, &submodule_spec) { > + strbuf_addf(&sb, "submodule.active=%s", > + item->string); > + string_list_append(&option_config, > + strbuf_detach(&sb, NULL)); > + } > + } OK. Each pathspec becomes submodule.active in the newly created repository.