Recursive invocations of submodule update/status preserve all arguments in the recursive invocation. This tends to cause undesired behavior when those arguments include the name of a submodule, as it tries to recurse into a nested submodule with the same name rather than recursing into all child submodules of the named submodule. This commit changes the argument preservation to only preserve flags. When specifying a submodule name on the command-line, all child submodules of that named submodule will be recursed into correctly, and it will not attempt to recurse into a phantom nested submodule with the same name as its parent. Signed-off-by: Kevin Ballard <kevin@xxxxxx> --- This commit was inspired by my coworker, who tried to run `git submodule update --recursive molecules` (where molecules is the name of a submodule) and received the rather unexpected error error: pathspec 'molecules' did not match any file(s) known to git. Did you forget to 'git add'? git-submodule.sh | 21 +++++++++------------ t/t7407-submodule-foreach.sh | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index ec7a5e4..52c693c 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -407,41 +407,35 @@ cmd_init() cmd_update() { # parse $args after "submodule ... update". - orig_args="$(quote_words "$@")" + orig_flags= while test $# -ne 0 do case "$1" in -q|--quiet) - shift GIT_QUIET=1 ;; -i|--init) init=1 - shift ;; -N|--no-fetch) - shift nofetch=1 ;; -r|--rebase) - shift update="rebase" ;; --reference) case "$2" in '') usage ;; esac reference="--reference=$2" - shift 2 + orig_flags="$orig_flags $(quote_words "$1")" + shift ;; --reference=*) reference="$1" - shift ;; -m|--merge) - shift update="merge" ;; --recursive) - shift recursive=1 ;; --) @@ -455,6 +449,8 @@ cmd_update() break ;; esac + orig_flags="$orig_flags $(quote_words "$1")" + shift done if test -n "$init" @@ -533,7 +529,7 @@ cmd_update() if test -n "$recursive" then - eval "set - $orig_args" + eval "set - $orig_flags" (clear_local_git_env; cd "$path" && cmd_update "$@") || die "Failed to recurse into submodule path '$path'" fi @@ -767,7 +763,7 @@ cmd_summary() { cmd_status() { # parse $args after "submodule ... status". - orig_args="$(quote_words "$@")" + orig_flags= while test $# -ne 0 do case "$1" in @@ -791,6 +787,7 @@ cmd_status() break ;; esac + orig_flags="$orig_flags $(quote_words "$1")" shift done @@ -822,7 +819,7 @@ cmd_status() then ( prefix="$displaypath/" - eval "set - $orig_args" + eval "set - $orig_flags" clear_local_git_env cd "$path" && cmd_status "$@" diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh index 905a8ba..2d5a855 100755 --- a/t/t7407-submodule-foreach.sh +++ b/t/t7407-submodule-foreach.sh @@ -238,4 +238,23 @@ test_expect_success 'use "git clone --recursive" to checkout all submodules' ' test -d clone4/nested1/nested2/nested3/submodule/.git ' +test_expect_success 'use "update --recursive nested1" to checkout all submodules rooted in nested1' ' + git clone super clone5 && + ( + cd clone5 && + test ! -d sub1/.git && + test ! -d sub2/.git && + test ! -d sub3/.git && + test ! -d nested1/.git && + git submodule update --init --recursive -- nested1 && + test ! -d sub1/.git && + test ! -d sub2/.git && + test ! -d sub3/.git && + test -d nested1/.git && + test -d nested1/nested2/.git && + test -d nested1/nested2/nested3/.git && + test -d nested1/nested2/nested3/submodule/.git + ) +' + test_done -- 1.7.3.2.200.ga1bd -- 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