From: "W. Trevor King" <wking@xxxxxxxxxx> The previous code only checked out the requested branch in cmd_add. This commit moves the branch-checkout logic into module_clone, where it can be shared by cmd_add and cmd_update. I also update the initial checkout command to use 'rebase' to preserve branches setup during module_clone. Signed-off-by: W. Trevor King <wking@xxxxxxxxxx> --- On Fri, Jan 03, 2014 at 09:49:01AM +0100, Francesco Pretto wrote: > - there's a developer "update" user. He will clone the submodule > repository with an *attached* HEAD. Subsequent "merge" or "rebase" > update operations will keep the HEAD attached. 'merge' and 'rebase' updates don't change the HEAD attachment. Branches stay branches and detached HEADs stay detached. If you've moved away from the 'checkout' update mechanism, the only thing you still need is a way to get an initial checkout on a branch. This should do it (I can add tests if folks like the general approach). git-submodule.sh | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index 2979197..e2e5a6c 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -253,6 +253,7 @@ module_clone() url=$3 reference="$4" depth="$5" + branch="$6" quiet= if test -n "$GIT_QUIET" then @@ -306,7 +307,14 @@ 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") + ( + clear_local_git_env + cd "$sm_path" && + GIT_WORK_TREE=. git config core.worktree "$rel/$b" && + if test -n "$branch"; then + git checkout -f -q -B "$branch" "origin/$branch" && echo "checked out $branch" + fi + ) || die "$(eval_gettext "Unable to setup cloned submodule '\$sm_path'")" } isnumber() @@ -469,16 +477,7 @@ Use -f if you really want to add it." >&2 echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")" fi fi - 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'")" + module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" "$branch" || exit fi git config submodule."$sm_name".url "$realrepo" @@ -815,7 +814,7 @@ Maybe you want to use 'update --init'?")" if ! test -d "$sm_path"/.git -o -f "$sm_path"/.git then - module_clone "$sm_path" "$name" "$url" "$reference" "$depth" || exit + module_clone "$sm_path" "$name" "$url" "$reference" "$depth" "$branch" || exit cloned_modules="$cloned_modules;$name" subsha1= else @@ -861,7 +860,12 @@ Maybe you want to use 'update --init'?")" case ";$cloned_modules;" in *";$name;"*) # then there is no local change to integrate - update_module= ;; + if test -n "$branch"; then + update_module="!git reset --hard -q" + else + update_module= + fi + ;; esac must_die_on_failure= -- 1.8.5.2.gaa5d535.dirty -- 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