Revert "submodule: explicit local branch creation in module_clone"
authorJunio C Hamano <gitster@pobox.com>
Wed, 2 Apr 2014 21:15:36 +0000 (14:15 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 2 Apr 2014 21:15:36 +0000 (14:15 -0700)
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
Documentation/gitmodules.txt
git-submodule.sh
t/t7406-submodule-update.sh
index a15d92d09bbd12aa553bbafa3d7f40e17504b09f..89c4d3e39474ed601255371c30b98bdd569f671d 100644 (file)
@@ -15,7 +15,7 @@ SYNOPSIS
 'git submodule' [--quiet] init [--] [<path>...]
 'git submodule' [--quiet] deinit [-f|--force] [--] <path>...
 'git submodule' [--quiet] update [--init] [--remote] [-N|--no-fetch]
-             [-f|--force] [--checkout|--rebase|--merge] [--reference <repository>]
+             [-f|--force] [--rebase|--merge] [--reference <repository>]
              [--depth <depth>] [--recursive] [--] [<path>...]
 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
              [commit] [--] [<path>...]
@@ -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.<name>.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.<path>.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.<name>.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.<name>.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
index f539e3f66a8b4c9b2603b0e2f63a89dd2adf1bfe..347a9f76ee809c3691dc6580b0fba3ebde0b0e3c 100644 (file)
@@ -55,10 +55,6 @@ submodule.<name>.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.<name>.fetchRecurseSubmodules::
        This option can be used to control recursive fetching of this
index 6135cfa9127c1da094df59236f926c01721ae58b..b55d83ac46a96ba15fb7ac8cb43b8c279b40d119 100755 (executable)
@@ -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=
index 28ca76384f6472b5d74564450ed122da9d49fe70..29d3d2cca03d733245ab4d84899f10e78d542573 100755 (executable)
@@ -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