X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-clone.sh;h=377d59e62cecd305fc7cf69aa927b13225fdb3eb;hb=4dc00021f784697e6d196ec285c8689d0777c533;hp=bfb8fd628536c5bbb08c9d07c7e93455cd253650;hpb=4447badcd22a889d656192803eff1003602839c5;p=git.git diff --git a/git-clone.sh b/git-clone.sh index bfb8fd62..377d59e6 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 "Usage: $0 [-l [-s]] [-q] [-u ] [-o ] [-n] []" exit 1 } @@ -23,7 +23,7 @@ fi http_fetch () { # $1 = Remote, $2 = Local - curl -nsf $curl_extra_args "$1" >"$2" + curl -nsfL $curl_extra_args "$1" >"$2" } clone_dumb_http () { @@ -31,29 +31,19 @@ clone_dumb_http () { cd "$2" && clone_tmp='.git/clone-tmp' && mkdir -p "$clone_tmp" || exit 1 - http_fetch "$1/info/refs" "$clone_tmp/refs" && - http_fetch "$1/objects/info/packs" "$clone_tmp/packs" || { + http_fetch "$1/info/refs" "$clone_tmp/refs" || { echo >&2 "Cannot get remote repository information. Perhaps git-update-server-info needs to be run there?" exit 1; } - while read type name - do - case "$type" in - P) ;; - *) continue ;; - esac && - - idx=`expr "$name" : '\(.*\)\.pack'`.idx - http_fetch "$1/objects/pack/$name" ".git/objects/pack/$name" && - http_fetch "$1/objects/pack/$idx" ".git/objects/pack/$idx" && - git-verify-pack ".git/objects/pack/$idx" || exit 1 - done <"$clone_tmp/packs" - 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,14 +51,25 @@ Perhaps git-update-server-info needs to be run there?" quiet= use_local=no local_shared=no +no_checkout= upload_pack= +origin=origin 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 ;; + local_shared=yes; use_local=yes ;; *,-q|*,--quiet) quiet=-q ;; + 1,-o) usage;; + *,-o) + git-check-ref-format "$2" || { + echo >&2 "'$2' is not suitable for a branch name" + exit 1 + } + origin="$2"; shift + ;; 1,-u|1,--upload-pack) usage ;; *,-u|*,--upload-pack) shift @@ -90,7 +91,10 @@ if base=$(get_repo_base "$repo"); then fi dir="$2" -mkdir "$dir" && +# Try using "humanish" part of source repo if user didn't specify one +[ -z "$dir" ] && dir=$(echo "$repo" | sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*/||g') +[ -e "$dir" ] && echo "$dir already exists." && usage +mkdir -p "$dir" && D=$( (cd "$dir" && git-init-db && pwd) ) && @@ -120,8 +124,7 @@ yes,yes) fi && rm -f "$D/.git/objects/sample" && cd "$repo" && - find objects -type f -print | - cpio -puamd$l "$D/.git/" || exit 1 + find objects -depth -print | cpio -puamd$l "$D/.git/" || exit 1 ;; yes) mkdir -p "$D/.git/objects/info" @@ -139,7 +142,8 @@ 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 @@ -152,11 +156,12 @@ yes,yes) # 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" || + 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 && + ( cd "$D" && . git-parse-remote && resolve_alternates "$repo" <"./.git/TMP_ALT" ) | while read alt @@ -178,15 +183,40 @@ yes,yes) cd "$D" && case "$upload_pack" in '') git-clone-pack $quiet "$repo" ;; *) git-clone-pack $quiet "$upload_pack" "$repo" ;; - esac + esac || { + echo >&2 "clone-pack from '$repo' failed." + exit 1 + } ;; esac ;; esac -# Update origin. -mkdir -p "$D/.git/remotes/" && -rm -f "$D/.git/remotes/origin" && -echo >"$D/.git/remotes/origin" \ -"URL: $repo -Pull: master:origin" +cd "$D" || exit + +if test -f ".git/HEAD" +then + head_points_at=`git-symbolic-ref HEAD` + case "$head_points_at" in + refs/heads/*) + head_points_at=`expr "$head_points_at" : 'refs/heads/\(.*\)'` + mkdir -p .git/remotes && + echo >.git/remotes/origin \ + "URL: $repo +Pull: $head_points_at:$origin" && + git-update-ref "refs/heads/$origin" $(git-rev-parse HEAD) && + find .git/refs/heads -type f -print | + while read ref + do + head=`expr "$ref" : '.git/refs/heads/\(.*\)'` && + test "$head_points_at" = "$head" || + test "$origin" = "$head" || + echo "Pull: ${head}:${head}" + done >>.git/remotes/origin + esac + + case "$no_checkout" in + '') + git checkout + esac +fi