When the origin URL of a superproject is of the form foo/bar, submodule operations such as add, sync or init will configure the URL of any submodule with an origin URL that points at the incorrect location. Origin URLs of this form are not expected in most cases, since the origin URL of a repo will usually point to a location that is not nested within the current working tree. However, the situation can arise when the physical location of an upstream repo is managed with a symbolic link nested within the working tree itself. For example, suppose that a toolset is installed in ~/tools and ~/tools/mnt/usb is a occasionally used as the origin for a refresh of the toolset. Different users with different USB devices may map ~/tools/mnt/usb to a different subdirectory of /media, but the auto-update function of the toolset may simply pull an update from mnt/usb, assuming that the user has done what is required to initialise mnt/usb to refer to the correct subdirectory of /media. Signed-off-by: Jon Seymour <jon.seymour@xxxxxxxxx> --- git-submodule.sh | 2 ++ t/t7400-submodule-basic.sh | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/git-submodule.sh b/git-submodule.sh index 230c219..b8a7403 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -37,6 +37,7 @@ resolve_relative_url () remoteurl=$(git config "remote.$remote.url") || remoteurl=$(pwd) # the repository is its own authoritative upstream url="$1" + remoteurl=$(echo "$remoteurl" | sed "s|^[^/][^:]*\$|./&|") remoteurl=${remoteurl%/} sep=/ while test -n "$url" @@ -47,6 +48,7 @@ resolve_relative_url () case "$remoteurl" in .*/*) up_path="$(echo "$2" | sed "s/[^/]*/../g")" + remoteurl=${remoteurl#./} remoteurl="${up_path%/}/${remoteurl%/*}" ;; */*) diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index 71f30d8..a4a8363 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -533,7 +533,7 @@ test_expect_sucess 'test that submodule add creates the correct url when super o test "$(git config submodule.sub.url)" = ../../relative/subrepo ) ' -test_expect_failure 'test that submodule add creates the correct url when super origin url is relative/repo' ' +test_expect_success 'test that submodule add creates the correct url when super origin url is relative/repo' ' mkdir reladd && ( cd reladd && -- 1.7.10.2.594.g5c52315 -- 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