diff options
-rw-r--r-- | Documentation/git-submodule.txt | 4 | ||||
-rwxr-xr-x | git-submodule.sh | 58 | ||||
-rwxr-xr-x | t/t7403-submodule-sync.sh | 15 |
3 files changed, 47 insertions, 30 deletions
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index 12af4de5e1..acb9002fe4 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -167,7 +167,9 @@ commit for each submodule. sync:: Synchronizes submodules' remote URL configuration setting - to the value specified in .gitmodules. This is useful when + to the value specified in .gitmodules. It will only affect those + submodules which already have an url entry in .git/config (that is the + case when they are initialized or freshly added). This is useful when submodule URLs change upstream and you need to update your local repositories accordingly. + diff --git a/git-submodule.sh b/git-submodule.sh index 87c9452c8a..3daa0c834c 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -250,7 +250,6 @@ Use -f if you really want to add it." && url="$repo" ;; esac - git config submodule."$path".url "$url" else module_clone "$path" "$realrepo" "$reference" || exit @@ -264,6 +263,7 @@ Use -f if you really want to add it." && esac ) || die "$(eval_gettext "Unable to checkout submodule '\$path'")" fi + git config submodule."$path".url "$url" git add $force "$path" || die "$(eval_gettext "Failed to add submodule '\$path'")" @@ -363,25 +363,26 @@ cmd_init() do # Skip already registered paths name=$(module_name "$path") || exit - url=$(git config submodule."$name".url) - test -z "$url" || continue - - url=$(git config -f .gitmodules submodule."$name".url) - test -z "$url" && - die "$(eval_gettext "No url found for submodule path '\$path' in .gitmodules")" - - # Possibly a url relative to parent - case "$url" in - ./*|../*) - url=$(resolve_relative_url "$url") || exit - ;; - esac - - git config submodule."$name".url "$url" || - die "$(eval_gettext "Failed to register url for submodule path '\$path'")" + if test -z "$(git config "submodule.$name.url")" + then + url=$(git config -f .gitmodules submodule."$name".url) + test -z "$url" && + die "$(eval_gettext "No url found for submodule path '\$path' in .gitmodules")" + + # Possibly a url relative to parent + case "$url" in + ./*|../*) + url=$(resolve_relative_url "$url") || exit + ;; + esac + git config submodule."$name".url "$url" || + die "$(eval_gettext "Failed to register url for submodule path '\$path'")" + fi + # Copy "update" setting when it is not set yet upd="$(git config -f .gitmodules submodule."$name".update)" test -z "$upd" || + test -n "$(git config submodule."$name".update)" || git config submodule."$name".update "$upd" || die "$(eval_gettext "Failed to register update mode for submodule path '\$path'")" @@ -925,17 +926,20 @@ cmd_sync() ;; esac - say "$(eval_gettext "Synchronizing submodule url for '\$name'")" - git config submodule."$name".url "$url" - - if test -e "$path"/.git + if git config "submodule.$name.url" >/dev/null 2>/dev/null then - ( - clear_local_git_env - cd "$path" - remote=$(get_default_remote) - git config remote."$remote".url "$url" - ) + say "$(eval_gettext "Synchronizing submodule url for '\$name'")" + git config submodule."$name".url "$url" + + if test -e "$path"/.git + then + ( + clear_local_git_env + cd "$path" + remote=$(get_default_remote) + git config remote."$remote".url "$url" + ) + fi fi done } diff --git a/t/t7403-submodule-sync.sh b/t/t7403-submodule-sync.sh index d600583cef..95ffe349a7 100755 --- a/t/t7403-submodule-sync.sh +++ b/t/t7403-submodule-sync.sh @@ -25,7 +25,8 @@ test_expect_success setup ' git clone super super-clone && (cd super-clone && git submodule update --init) && git clone super empty-clone && - (cd empty-clone && git submodule init) + (cd empty-clone && git submodule init) && + git clone super top-only-clone ' test_expect_success 'change submodule' ' @@ -66,7 +67,7 @@ test_expect_success '"git submodule sync" should update submodule URLs' ' ) ' -test_expect_success '"git submodule sync" should update submodule URLs if not yet cloned' ' +test_expect_success '"git submodule sync" should update known submodule URLs' ' (cd empty-clone && git pull && git submodule sync && @@ -74,4 +75,14 @@ test_expect_success '"git submodule sync" should update submodule URLs if not ye ) ' +test_expect_success '"git submodule sync" should not vivify uninteresting submodule' ' + (cd top-only-clone && + git pull && + git submodule sync && + test -z "$(git config submodule.submodule.url)" && + git submodule sync submodule && + test -z "$(git config submodule.submodule.url)" + ) +' + test_done |