Modules that are defined using relative urls to the master project are assumed to be completely owned by the project. When running "submodule update" from the top level, it is reasonable that the entire project exists at the remote given by top-level branch.<name>.remote. Using the remote machinery, this remote can be different for each branch and can be different than the current defaults in each submodule. This teaches submodule to: 1) Possibly define the current master's remote in each submodule, using the same relative url used by submodule init. 2) Fetch each submodule's updates from the master's remote. Submodules defined using absolute urls (not relative to the parent) are not touched by this logic. Such modules are assumed to be independent of the master project so submodule can do no better than to fetch from their currently defined default remotes as already done. Signed-off-by: Mark Levedahl <mlevedahl@xxxxxxxxx> --- git-submodule.sh | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index bb0d265..8f31ebe 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -255,6 +255,8 @@ cmd_init() # # Update each submodule path to correct revision, using clone and checkout as needed +# For owned submodules (defined using relative url), we use master project's remote +# and define that in each submodule if not already there # # $@ = requested paths (default to all) # @@ -281,6 +283,7 @@ cmd_update() shift done + master_remote=$(get_default_remote) git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path do @@ -306,9 +309,24 @@ cmd_update() die "Unable to find current revision in submodule path '$path'" fi + baseurl="$(GIT_CONFIG=.gitmodules git config submodule."$name".url)" + case "$baseurl" in + ./*|../*) + fetch_remote=$master_remote + (unset GIT_DIR ; cd "$path" && git config remote."$fetch_remote".url > nul) || + ( + absurl="$(resolve_relative_url $baseurl)" + unset GIT_DIR; cd "$path" && git remote add "$master_remote" "$absurl" + ) || die "Unable to define remote '$fetch_remote' in submodule path '$path'" + ;; + *) + fetch_remote= + ;; + esac + if test "$subsha1" != "$sha1" then - (unset GIT_DIR; cd "$path" && git-fetch && + (unset GIT_DIR; cd "$path" && git-fetch $fetch_remote && git-checkout -q "$sha1") || die "Unable to checkout '$sha1' in submodule path '$path'" -- 1.5.4.18.g43c18 - 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