From 211b7f19c7b046a6cadd36d54c549e4f335f0519 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Wed, 6 Jun 2007 11:13:02 +0200 Subject: git-submodule: clone during update, not during init This teaches 'git-submodule init' to register submodule paths and urls in .git/config instead of actually cloning them. The cloning is now handled as part of 'git-submodule update'. With this change it is possible to specify preferred/alternate urls for the submodules in .git/config before the submodules are cloned. Signed-off-by: Lars Hjemli Signed-off-by: Junio C Hamano --- git-submodule.sh | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 486d3b2124..8bdd99a2f3 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -53,7 +53,7 @@ module_clone() } # -# Run clone + checkout on missing submodules +# Register submodules in .git/config # # $@ = requested paths (default to all) # @@ -62,37 +62,23 @@ modules_init() git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path do - # Skip submodule paths that already contain a .git directory. - # This will also trigger if $path is a symlink to a git - # repository - test -d "$path"/.git && continue + # Skip already registered paths + url=$(git-config submodule."$path".url) + test -z "$url" || continue url=$(GIT_CONFIG=.gitmodules git-config module."$path".url) test -z "$url" && die "No url found for submodule '$path' in .gitmodules" - # MAYBE FIXME: this would be the place to check GIT_CONFIG - # for a preferred url for this submodule, possibly like this: - # - # modname=$(GIT_CONFIG=.gitmodules git-config module."$path".name) - # alturl=$(git-config module."$modname".url) - # - # This would let the versioned .gitmodules file use the submodule - # path as key, while the unversioned GIT_CONFIG would use the - # logical modulename (if present) as key. But this would need - # another fallback mechanism if the module wasn't named. + git-config submodule."$path".url "$url" || + die "Failed to register url for submodule '$path'" - module_clone "$path" "$url" || exit - - (unset GIT_DIR && cd "$path" && git-checkout -q "$sha1") || - die "Checkout of submodule '$path' failed" - - say "Submodule '$path' initialized" + say "Submodule '$path' registered with url '$url'" done } # -# Checkout correct revision of each initialized submodule +# Update each submodule path to correct revision, using clone and checkout as needed # # $@ = requested paths (default to all) # @@ -101,14 +87,21 @@ modules_update() git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path do - if ! test -d "$path"/.git + url=$(git-config submodule."$path".url) + if test -z "$url" then # Only mention uninitialized submodules when its # path have been specified test "$#" != "0" && say "Submodule '$path' not initialized" - continue; + continue fi + + if ! test -d "$path"/.git + then + module_clone "$path" "$url" || exit + fi + subsha1=$(unset GIT_DIR && cd "$path" && git-rev-parse --verify HEAD) || die "Unable to find current revision of submodule '$path'" -- cgit v1.3-5-g9baa