Merge branch 'wk/submodule-on-branch'
Make sure 'submodule update' modes that do not detach HEADs can be used more pleasantly by checking out a concrete branch when cloning them to prime the well. * wk/submodule-on-branch: Documentation: describe 'submodule update --remote' use case submodule: explicit local branch creation in module_clone submodule: document module_clone arguments in comments submodule: make 'checkout' update_module mode more explicit
This commit is contained in:
@ -241,6 +241,15 @@ module_name()
|
||||
#
|
||||
# Clone a submodule
|
||||
#
|
||||
# $1 = submodule path
|
||||
# $2 = submodule 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.
|
||||
# Likewise, cmd_add checks that path does not exist at all,
|
||||
@ -253,6 +262,8 @@ module_clone()
|
||||
url=$3
|
||||
reference="$4"
|
||||
depth="$5"
|
||||
start_point="$6"
|
||||
local_branch="$7"
|
||||
quiet=
|
||||
if test -n "$GIT_QUIET"
|
||||
then
|
||||
@ -306,7 +317,16 @@ 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" &&
|
||||
# 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'")"
|
||||
}
|
||||
|
||||
isnumber()
|
||||
@ -469,16 +489,15 @@ 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'")"
|
||||
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
|
||||
fi
|
||||
git config submodule."$sm_name".url "$realrepo"
|
||||
|
||||
@ -799,32 +818,35 @@ cmd_update()
|
||||
fi
|
||||
name=$(module_name "$sm_path") || exit
|
||||
url=$(git config submodule."$name".url)
|
||||
branch=$(get_submodule_config "$name" branch master)
|
||||
config_branch=$(get_submodule_config "$name" branch)
|
||||
branch="${config_branch:-master}"
|
||||
local_branch="$branch"
|
||||
if ! test -z "$update"
|
||||
then
|
||||
update_module=$update
|
||||
else
|
||||
update_module=$(git config submodule."$name".update)
|
||||
case "$update_module" in
|
||||
'')
|
||||
;; # Unset update mode
|
||||
checkout | rebase | merge | none)
|
||||
;; # Known update modes
|
||||
!*)
|
||||
;; # Custom update command
|
||||
*)
|
||||
die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
|
||||
;;
|
||||
esac
|
||||
if test -z "$update_module"
|
||||
then
|
||||
update_module="checkout"
|
||||
fi
|
||||
fi
|
||||
|
||||
displaypath=$(relative_path "$prefix$sm_path")
|
||||
|
||||
if test "$update_module" = "none"
|
||||
then
|
||||
case "$update_module" in
|
||||
none)
|
||||
echo "Skipping submodule '$displaypath'"
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
checkout)
|
||||
local_branch=""
|
||||
;;
|
||||
rebase | merge | !*)
|
||||
;;
|
||||
*)
|
||||
die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
|
||||
esac
|
||||
|
||||
if test -z "$url"
|
||||
then
|
||||
@ -838,7 +860,8 @@ 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
|
||||
start_point="origin/${branch}"
|
||||
module_clone "$sm_path" "$name" "$url" "$reference" "$depth" "$start_point" "$local_branch" || exit
|
||||
cloned_modules="$cloned_modules;$name"
|
||||
subsha1=
|
||||
else
|
||||
@ -884,11 +907,16 @@ Maybe you want to use 'update --init'?")"
|
||||
case ";$cloned_modules;" in
|
||||
*";$name;"*)
|
||||
# then there is no local change to integrate
|
||||
update_module= ;;
|
||||
update_module='!git reset --hard -q'
|
||||
esac
|
||||
|
||||
must_die_on_failure=
|
||||
case "$update_module" in
|
||||
checkout)
|
||||
command="git checkout $subforce -q"
|
||||
die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$displaypath'")"
|
||||
say_msg="$(eval_gettext "Submodule path '\$displaypath': checked out '\$sha1'")"
|
||||
;;
|
||||
rebase)
|
||||
command="git rebase"
|
||||
die_msg="$(eval_gettext "Unable to rebase '\$sha1' in submodule path '\$displaypath'")"
|
||||
@ -908,10 +936,7 @@ Maybe you want to use 'update --init'?")"
|
||||
must_die_on_failure=yes
|
||||
;;
|
||||
*)
|
||||
command="git checkout $subforce -q"
|
||||
die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$displaypath'")"
|
||||
say_msg="$(eval_gettext "Submodule path '\$displaypath': checked out '\$sha1'")"
|
||||
;;
|
||||
die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
|
||||
esac
|
||||
|
||||
if (clear_local_git_env; cd "$sm_path" && $command "$sha1")
|
||||
|
||||
Reference in New Issue
Block a user