From d851ffb91f8c25f51b284cd4e849757d656de0d1 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 2 Apr 2014 14:15:36 -0700 Subject: [PATCH] Revert "submodule: explicit local branch creation in module_clone" This reverts commit 23d25e48f5ead73c9ce233986f90791abec9f1e8, as it is broken for users who haven't opted into the new feature of checking out submodule.*.branch with update mode set to checkout. --- Documentation/git-submodule.txt | 34 ++++++------------------ Documentation/gitmodules.txt | 4 --- git-submodule.sh | 58 ++++++++++++----------------------------- t/t7406-submodule-update.sh | 39 +-------------------------- 4 files changed, 26 insertions(+), 109 deletions(-) diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index a15d92d09b..89c4d3e394 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -15,7 +15,7 @@ SYNOPSIS 'git submodule' [--quiet] init [--] [...] 'git submodule' [--quiet] deinit [-f|--force] [--] ... 'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch] - [-f|--force] [--checkout|--rebase|--merge] [--reference ] + [-f|--force] [--rebase|--merge] [--reference ] [--depth ] [--recursive] [--] [...] 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) ] [commit] [--] [...] @@ -155,31 +155,13 @@ it contains local modifications. update:: Update the registered submodules, i.e. clone missing submodules and - checkout the commit specified in the index of the containing - repository. The update mode defaults to `checkout`, but can be - configured with the `submodule..update` setting or the - `--rebase`, `--merge`, or `--checkout` options. -+ -For updates that clone missing submodules, checkout-mode updates will -create submodules with detached HEADs; all other modes will create -submodules with a local branch named after `submodule..branch`. -+ -For updates that do not clone missing submodules, the submodule's HEAD -is only touched when the remote reference does not match the -submodule's HEAD (for none-mode updates, the submodule is never -touched). The remote reference is usually the gitlinked commit from -the superproject's tree, but with `--remote` it is the upstream -subproject's `submodule..branch`. This remote reference is -integrated with the submodule's HEAD using the specified update mode. -For checkout-mode updates, that will result in a detached HEAD. For -rebase- and merge-mode updates, the commit referenced by the -submodule's HEAD may change, but the symbolic reference will remain -unchanged (i.e. checked-out branches will still be checked-out -branches, and detached HEADs will still be detached HEADs). If none -of the builtin modes fit your needs, set `submodule..update` to -`!command` to configure a custom integration command. `command` can -be any arbitrary shell command that takes a single argument, namely -the sha1 to update to. + checkout the commit specified in the index of the containing repository. + This will make the submodules HEAD be detached unless `--rebase` or + `--merge` is specified or the key `submodule.$name.update` is set to + `rebase`, `merge` or `none`. `none` can be overridden by specifying + `--checkout`. Setting the key `submodule.$name.update` to `!command` + will cause `command` to be run. `command` can be any arbitrary shell + command that takes a single argument, namely the sha1 to update to. + If the submodule is not yet initialized, and you just want to use the setting as stored in .gitmodules, you can automatically initialize the diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt index f539e3f66a..347a9f76ee 100644 --- a/Documentation/gitmodules.txt +++ b/Documentation/gitmodules.txt @@ -55,10 +55,6 @@ submodule..branch:: A remote branch name for tracking updates in the upstream submodule. If the option is not specified, it defaults to 'master'. See the `--remote` documentation in linkgit:git-submodule[1] for details. -+ -This branch name is also used for the local branch created by -non-checkout cloning updates. See the `update` documentation in -linkgit:git-submodule[1] for details. submodule..fetchRecurseSubmodules:: This option can be used to control recursive fetching of this diff --git a/git-submodule.sh b/git-submodule.sh index 6135cfa912..b55d83ac46 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -246,9 +246,6 @@ module_name() # $3 = URL to clone # $4 = reference repository to reuse (empty for independent) # $5 = depth argument for shallow clones (empty for deep) -# $6 = (remote-tracking) starting point for the local branch (empty for HEAD) -# $7 = local branch to create (empty for a detached HEAD, unless $6 is -# also empty, in which case the local branch is left unchanged) # # Prior to calling, cmd_update checks that a possibly existing # path is not a git repository. @@ -262,8 +259,6 @@ module_clone() url=$3 reference="$4" depth="$5" - start_point="$6" - local_branch="$7" quiet= if test -n "$GIT_QUIET" then @@ -317,16 +312,7 @@ module_clone() echo "gitdir: $rel/$a" >"$sm_path/.git" rel=$(echo $a | sed -e 's|[^/][^/]*|..|g') - ( - clear_local_git_env - cd "$sm_path" && - GIT_WORK_TREE=. git config core.worktree "$rel/$b" && - # ash fails to wordsplit ${local_branch:+-B "$local_branch"...} - case "$local_branch" in - '') git checkout -f -q ${start_point:+"$start_point"} ;; - ?*) git checkout -f -q -B "$local_branch" ${start_point:+"$start_point"} ;; - esac - ) || die "$(eval_gettext "Unable to setup cloned submodule '\$sm_path'")" + (clear_local_git_env; cd "$sm_path" && GIT_WORK_TREE=. git config core.worktree "$rel/$b") } isnumber() @@ -489,15 +475,16 @@ Use -f if you really want to add it." >&2 echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")" fi fi - if test -n "$branch" - then - start_point="origin/$branch" - local_branch="$branch" - else - start_point="" - local_branch="" - fi - module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" "$start_point" "$local_branch" || exit + module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" || exit + ( + clear_local_git_env + cd "$sm_path" && + # ash fails to wordsplit ${branch:+-b "$branch"...} + case "$branch" in + '') git checkout -f -q ;; + ?*) git checkout -f -q -B "$branch" "origin/$branch" ;; + esac + ) || die "$(eval_gettext "Unable to checkout submodule '\$sm_path'")" fi git config submodule."$sm_name".url "$realrepo" @@ -818,9 +805,7 @@ cmd_update() fi name=$(module_name "$sm_path") || exit url=$(git config submodule."$name".url) - config_branch=$(get_submodule_config "$name" branch) - branch="${config_branch:-master}" - local_branch="$branch" + branch=$(get_submodule_config "$name" branch master) if ! test -z "$update" then update_module=$update @@ -834,19 +819,11 @@ cmd_update() displaypath=$(relative_path "$prefix$sm_path") - case "$update_module" in - none) + if test "$update_module" = "none" + then echo "Skipping submodule '$displaypath'" continue - ;; - checkout) - local_branch="" - ;; - rebase | merge | !*) - ;; - *) - die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")" - esac + fi if test -z "$url" then @@ -860,8 +837,7 @@ Maybe you want to use 'update --init'?")" if ! test -d "$sm_path"/.git -o -f "$sm_path"/.git then - start_point="origin/${branch}" - module_clone "$sm_path" "$name" "$url" "$reference" "$depth" "$start_point" "$local_branch" || exit + module_clone "$sm_path" "$name" "$url" "$reference" "$depth" || exit cloned_modules="$cloned_modules;$name" subsha1= else @@ -907,7 +883,7 @@ Maybe you want to use 'update --init'?")" case ";$cloned_modules;" in *";$name;"*) # then there is no local change to integrate - update_module='!git reset --hard -q' + update_module=checkout ;; esac must_die_on_failure= diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index 28ca76384f..29d3d2cca0 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -63,9 +63,6 @@ test_expect_success 'setup a submodule tree' ' git submodule add ../none none && test_tick && git commit -m "none" - ) && - (cd super && - git tag initial-setup ) ' @@ -706,7 +703,7 @@ test_expect_success 'submodule update places git-dir in superprojects git-dir re git clone super_update_r super_update_r2 && (cd super_update_r2 && git submodule update --init --recursive >actual && - test_i18ngrep "Submodule path .submodule/subsubmodule.: .git reset --hard -q" actual && + test_i18ngrep "Submodule path .submodule/subsubmodule.: checked out" actual && (cd submodule/subsubmodule && git log > ../../expected ) && @@ -777,38 +774,4 @@ test_expect_success 'submodule update --recursive drops module name before recur test_i18ngrep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual ) ' - -test_expect_success 'submodule update --checkout clones detached HEAD' ' - git clone super super4 && - echo "detached HEAD" >expected && - (cd super4 && - git reset --hard initial-setup && - git submodule init submodule && - git submodule update >> /tmp/log 2>&1 && - (cd submodule && - git symbolic-ref HEAD > ../../actual || - echo "detached HEAD" > ../../actual - ) - ) && - test_cmp actual expected && - rm -rf super4 -' - -test_expect_success 'submodule update --merge clones attached HEAD' ' - git clone super super4 && - echo "refs/heads/master" >expected && - (cd super4 && - git reset --hard initial-setup && - git submodule init submodule && - git config submodule.submodule.update merge && - git submodule update --merge && - (cd submodule && - git symbolic-ref HEAD > ../../actual || - echo "detached HEAD" > ../../actual - ) - ) && - test_cmp actual expected && - rm -rf super4 -' - test_done -- 2.11.4.GIT