From: Junio C Hamano <gitster@xxxxxxxxx> 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@xxxxxx> Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- Am 24.06.2011 00:28, schrieb Junio C Hamano: > Actually, shouldn't the fix be more like this patch, which is directly on > top of 33f072f? I think this is more in line with what the end user wants > to tell the system with "submodule init", namely "I am interested in this > submodule". Yes, I am convinced your patch is the doing Right Thing. I squashed in a change to the git submodule sync documentation (explicitly stating that a sync only affects submodules which have an url entry in .git/config) and two more lines in the test you added to make sure that explicitly giving a submodule on the command line uses the same logic. What do you think? (I'll send another patch shortly addressing the failing tests when jl/submodule-add-relurl-wo-upstream is merged into this one) Documentation/git-submodule.txt | 4 +++- git-submodule.sh | 23 +++++++++++++---------- t/t7403-submodule-sync.sh | 15 +++++++++++++-- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index 5e7a413..2b31d5f 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 d189a24..543f1d0 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -874,17 +874,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 } diff --git a/t/t7403-submodule-sync.sh b/t/t7403-submodule-sync.sh index d600583..95ffe34 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 -- 1.7.6.rc3.1.g8fd6 -- 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