X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-clone.sh;h=18e692a67b1515c57a20c8574ed53836fb53f2bd;hb=e24317b4d093e4b148996172d0b749f09a0e6f2e;hp=a21f13af2ab1ea54db3b8919a5fbb00c5bb59bf4;hpb=4803c2802c11525b11d106247661ea13b2a9ce98;p=git.git diff --git a/git-clone.sh b/git-clone.sh index a21f13af..18e692a6 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -9,7 +9,7 @@ unset CDPATH usage() { - echo >&2 "* git clone [-l [-s]] [-q] [-u ] " + echo >&2 "* git clone [-l [-s]] [-q] [-u ] [-n] " exit 1 } @@ -53,7 +53,11 @@ Perhaps git-update-server-info needs to be run there?" while read sha1 refname do name=`expr "$refname" : 'refs/\(.*\)'` && - git-http-fetch -v -a -w "$name" "$name" "$1/" || exit 1 + case "$name" in + *^*) ;; + *) + git-http-fetch -v -a -w "$name" "$name" "$1/" || exit 1 + esac done <"$clone_tmp/refs" rm -fr "$clone_tmp" } @@ -61,10 +65,12 @@ Perhaps git-update-server-info needs to be run there?" quiet= use_local=no local_shared=no +no_checkout= upload_pack= while case "$#,$1" in 0,*) break ;; + *,-n) no_checkout=yes ;; *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; *,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared) local_shared=yes ;; @@ -139,13 +145,39 @@ yes,yes) then HEAD=HEAD fi - tar Ccf "$repo" - refs $HEAD | tar Cxf "$D/.git" - || exit 1 + (cd "$repo" && tar cf - refs $HEAD) | + (cd "$D/.git" && tar xf -) || exit 1 ;; *) case "$repo" in rsync://*) - rsync $quiet -avz --ignore-existing "$repo/objects/" "$D/.git/objects/" && - rsync $quiet -avz --ignore-existing "$repo/refs/" "$D/.git/refs/" + rsync $quiet -av --ignore-existing \ + --exclude info "$repo/objects/" "$D/.git/objects/" && + rsync $quiet -av --ignore-existing \ + --exclude info "$repo/refs/" "$D/.git/refs/" || exit + + # Look at objects/info/alternates for rsync -- http will + # support it natively and git native ones will do it on the + # remote end. Not having that file is not a crime. + rsync -q "$repo/objects/info/alternates" \ + "$D/.git/TMP_ALT" 2>/dev/null || + rm -f "$D/.git/TMP_ALT" + if test -f "$D/.git/TMP_ALT" + then + ( cd $D && + . git-parse-remote && + resolve_alternates "$repo" <"./.git/TMP_ALT" ) | + while read alt + do + case "$alt" in 'bad alternate: '*) die "$alt";; esac + case "$quiet" in + '') echo >&2 "Getting alternate: $alt" ;; + esac + rsync $quiet -av --ignore-existing \ + --exclude info "$alt" "$D/.git/objects" || exit + done + rm -f "$D/.git/TMP_ALT" + fi ;; http://*) clone_dumb_http "$repo" "$D" @@ -160,9 +192,16 @@ yes,yes) ;; esac -# Update origin. -mkdir -p "$D/.git/remotes/" && -rm -f "$D/.git/remotes/origin" && -echo >"$D/.git/remotes/origin" \ -"URL: $repo +cd $D || exit + +if test -f ".git/HEAD" +then + mkdir -p .git/remotes || exit + echo >.git/remotes/origin \ + "URL: $repo Pull: master:origin" + case "$no_checkout" in + '') + git checkout + esac +fi