Skip to content

Commit

Permalink
submodule sync: do not auto-vivify uninteresting submodule
Browse files Browse the repository at this point in the history
Earlier 33f072f (submodule sync: Update "submodule.<name>.url" for empty
directories, 2010-10-08) attempted to fix a bug where "git submodule sync"
command does not update the URL if the current superproject does not have
a checkout of the submodule.

However, it did so by unconditionally registering submodule.$name.url to
every submodule in the project, even the ones that the user has never
showed interest in at all by running 'git submodule init' command. This
caused subsequent 'git submodule update' to start cloning/updating submodules
that are not interesting to the user at all.

Update the code so that the URL is updated from the .gitmodules file only
for submodules that already have submodule.$name.url entries, i.e. the
ones the user has showed interested in having a checkout.

Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Jun 26, 2011
1 parent 33f072f commit ccee608
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 13 deletions.
4 changes: 3 additions & 1 deletion Documentation/git-submodule.txt
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,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.
+
Expand Down
23 changes: 13 additions & 10 deletions git-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -836,17 +836,20 @@ cmd_sync()
;;
esac

say "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 "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
}
Expand Down
15 changes: 13 additions & 2 deletions t/t7403-submodule-sync.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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' '
Expand Down Expand Up @@ -66,12 +67,22 @@ 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 &&
test -d "$(git config submodule.submodule.url)"
)
'

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

0 comments on commit ccee608

Please sign in to comment.