X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-clone-script;h=60dc2a9d8854fd08c708d4a75f1c887d1d724b9f;hb=eb3c430a85306d08ad5f1cb3d29f990041bc2457;hp=19697427ecfac400809eee9ba7c1625eea13f409;hpb=ba375acff7692cbca16f7cc2e69b71563188ab7f;p=git.git diff --git a/git-clone-script b/git-clone-script index 19697427..60dc2a9d 100755 --- a/git-clone-script +++ b/git-clone-script @@ -6,7 +6,7 @@ # Clone a repository into a different directory that does not yet exist. usage() { - echo >&2 "* git clone [-l] " + echo >&2 "* git clone [-l] [-q] [-u ] " exit 1 } @@ -14,11 +14,18 @@ get_repo_base() { (cd "$1" && (cd .git ; pwd)) 2> /dev/null } +quiet= use_local=no +upload_pack= while case "$#,$1" in 0,*) break ;; - *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; + *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; + *,-q|*,--quiet) quiet=-q ;; + 1,-u|1,--upload-pack) usage ;; + *,-u|*,--upload-pack) + shift + upload_pack="--exec=$1" ;; *,-*) usage ;; *) break ;; esac @@ -46,11 +53,8 @@ test -d "$D" || usage case "$local,$use_local" in yes,yes) ( cd "$repo/objects" ) || { - repo="$repo/.git" - ( cd "$repo/objects" ) || { - echo >&2 "-l flag seen but $repo is not local." - exit 1 - } + echo >&2 "-l flag seen but $repo is not local." + exit 1 } # See if we can hardlink and drop "l" if not. @@ -66,7 +70,9 @@ yes,yes) l=l fi && rm -f "$D/.git/objects/sample" && - cp -r$l "$repo/objects" "$D/.git/" || exit 1 + cd "$repo" && + find objects -type f -print | + cpio -puamd$l "$D/.git/" || exit 1 # Make a duplicate of refs and HEAD pointer HEAD= @@ -75,8 +81,37 @@ yes,yes) HEAD=HEAD fi tar Ccf "$repo" - refs $HEAD | tar Cxf "$D/.git" - || exit 1 - exit 0 + ;; +*) + case "$repo" in + rsync://*) + rsync $quiet -avz --ignore-existing "$repo/objects/" "$D/.git/objects/" && + rsync $quiet -avz --ignore-existing "$repo/refs/" "$D/.git/refs/" + ;; + http://*) + git-clone-dumb-http "$repo" "$D" + case "$?" in + 2) + echo "Somebody should define smarter http server protocol" >&2 + exit 1 + ;; + 0) + ;; + *) + exit + esac + ;; + *) + cd "$D" && case "$upload_pack" in + '') git-clone-pack $quiet "$repo" ;; + *) git-clone-pack $quiet "$upload_pack" "$repo" ;; + esac + ;; + esac ;; esac -cd "$D" && git clone-pack "$repo" +# Update origin. +mkdir -p "$D/.git/branches/" && +rm -f "$D/.git/branches/origin" && +echo "$repo" >"$D/.git/branches/origin"