X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-clone.sh;h=de59904d56155faecedbd7cd4818a741dde43ffd;hb=fb6a9f93d39e4e5fdb83673a927f71a34e9fb7c0;hp=9db678beef97db1027389badf29a3ecf60659187;hpb=16563132977287314fa25348d97d0ffbe019442b;p=git.git diff --git a/git-clone.sh b/git-clone.sh index 9db678be..de59904d 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -9,7 +9,7 @@ unset CDPATH usage() { - echo >&2 "Usage: $0 [--reference ] [--bare] [-l [-s]] [-q] [-u ] [-o ] [-n] []" + echo >&2 "Usage: $0 [--template=] [--use-separate-remote] [--reference ] [--bare] [-l [-s]] [-q] [-u ] [--origin ] [-n] []" exit 1 } @@ -38,21 +38,22 @@ Perhaps git-update-server-info needs to be run there?" } while read sha1 refname do - name=`expr "$refname" : 'refs/\(.*\)'` && + name=`expr "z$refname" : 'zrefs/\(.*\)'` && case "$name" in *^*) continue;; esac if test -n "$use_separate_remote" && - branch_name=`expr "$name" : 'heads/\(.*\)'` + branch_name=`expr "z$name" : 'zheads/\(.*\)'` then - tname="remotes/$branch_name" + tname="remotes/$origin/$branch_name" else tname=$name fi git-http-fetch -v -a -w "$tname" "$name" "$1/" || exit 1 done <"$clone_tmp/refs" rm -fr "$clone_tmp" - http_fetch "$1/HEAD" "$GIT_DIR/REMOTE_HEAD" + http_fetch "$1/HEAD" "$GIT_DIR/REMOTE_HEAD" || + rm -f "$GIT_DIR/REMOTE_HEAD" } # Read git-fetch-pack -k output and store the remote branches. @@ -61,8 +62,9 @@ use File::Path qw(mkpath); use File::Basename qw(dirname); my $git_dir = $ARGV[0]; my $use_separate_remote = $ARGV[1]; +my $origin = $ARGV[2]; -my $branch_top = ($use_separate_remote ? "remotes" : "heads"); +my $branch_top = ($use_separate_remote ? "remotes/$origin" : "heads"); my $tag_top = "tags"; sub store { @@ -97,8 +99,10 @@ close FH; ' quiet= +local=no use_local=no local_shared=no +unset template no_checkout= upload_pack= bare= @@ -117,22 +121,33 @@ while *,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;; *,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared) local_shared=yes; use_local=yes ;; + 1,--template) usage ;; + *,--template) + shift; template="--template=$1" ;; + *,--template=*) + template="$1" ;; *,-q|*,--quiet) quiet=-q ;; *,--use-separate-remote) use_separate_remote=t ;; - 1,-o) usage;; 1,--reference) usage ;; *,--reference) shift; reference="$1" ;; *,--reference=*) reference=`expr "$1" : '--reference=\(.*\)'` ;; - *,-o) - git-check-ref-format "$2" || { + *,-o|*,--or|*,--ori|*,--orig|*,--origi|*,--origin) + case "$2" in + '') + usage ;; + */*) + echo >&2 "'$2' is not suitable for an origin name" + exit 1 + esac + git-check-ref-format "heads/$2" || { echo >&2 "'$2' is not suitable for a branch name" exit 1 } test -z "$origin_override" || { - echo >&2 "Do not give more than one -o options." + echo >&2 "Do not give more than one --origin options." exit 1 } origin_override=yes @@ -149,12 +164,19 @@ do shift done +repo="$1" +if test -z "$repo" +then + echo >&2 'you must specify a repository to clone.' + exit 1 +fi + # --bare implies --no-checkout if test yes = "$bare" then if test yes = "$origin_override" then - echo >&2 '--bare and -o $origin options are incompatible.' + echo >&2 '--bare and --origin $origin options are incompatible.' exit 1 fi if test t = "$use_separate_remote" @@ -165,20 +187,13 @@ then no_checkout=yes fi -if test -z "$origin_override$origin" +if test -z "$origin" then - if test -n "$use_separate_remote" - then - origin=remotes/master - else - origin=heads/origin - fi + origin=origin fi # Turn the source into an absolute path if # it is local -repo="$1" -local=no if base=$(get_repo_base "$repo"); then repo="$base" local=yes @@ -190,11 +205,11 @@ dir="$2" [ -e "$dir" ] && echo "$dir already exists." && usage mkdir -p "$dir" && D=$(cd "$dir" && pwd) && -trap 'err=$?; cd ..; rm -r "$D"; exit $err' exit +trap 'err=$?; cd ..; rm -r "$D"; exit $err' 0 case "$bare" in yes) GIT_DIR="$D" ;; *) GIT_DIR="$D/.git" ;; -esac && export GIT_DIR && git-init-db || usage +esac && export GIT_DIR && git-init-db ${template+"$template"} || usage case "$bare" in yes) GIT_DIR="$D" ;; @@ -252,11 +267,7 @@ yes,yes) ;; yes) mkdir -p "$GIT_DIR/objects/info" - { - test -f "$repo/objects/info/alternates" && - cat "$repo/objects/info/alternates"; - echo "$repo/objects" - } >"$GIT_DIR/objects/info/alternates" + echo "$repo/objects" >> "$GIT_DIR/objects/info/alternates" ;; esac git-ls-remote "$repo" >"$GIT_DIR/CLONE_HEAD" @@ -316,20 +327,33 @@ test -d "$GIT_DIR/refs/reference-tmp" && rm -fr "$GIT_DIR/refs/reference-tmp" if test -f "$GIT_DIR/CLONE_HEAD" then - # Figure out where the remote HEAD points at. - perl -e "$copy_refs" "$GIT_DIR" "$use_separate_remote" + # Read git-fetch-pack -k output and store the remote branches. + perl -e "$copy_refs" "$GIT_DIR" "$use_separate_remote" "$origin" fi cd "$D" || exit if test -z "$bare" && test -f "$GIT_DIR/REMOTE_HEAD" then - head_sha1=`cat "$GIT_DIR/REMOTE_HEAD"` # Figure out which remote branch HEAD points at. case "$use_separate_remote" in '') remote_top=refs/heads ;; - *) remote_top=refs/remotes ;; + *) remote_top="refs/remotes/$origin" ;; + esac + + head_sha1=`cat "$GIT_DIR/REMOTE_HEAD"` + case "$head_sha1" in + 'ref: refs/'*) + # Uh-oh, the remote told us (http transport done against + # new style repository with a symref HEAD). + # Ideally we should skip the guesswork but for now + # opt for minimum change. + head_sha1=`expr "z$head_sha1" : 'zref: refs/heads/\(.*\)'` + head_sha1=`cat "$GIT_DIR/$remote_top/$head_sha1"` + ;; esac + + # The name under $remote_top the remote HEAD seems to point at. head_points_at=$( ( echo "master" @@ -349,25 +373,37 @@ then done ) ) + + # Write out remotes/$origin file, and update our "$head_points_at". case "$head_points_at" in ?*) mkdir -p "$GIT_DIR/remotes" && - echo >"$GIT_DIR/remotes/origin" \ - "URL: $repo -Pull: refs/heads/$head_points_at:refs/$origin" && + git-symbolic-ref HEAD "refs/heads/$head_points_at" && case "$use_separate_remote" in - t) git-update-ref HEAD "$head_sha1" ;; - *) git-update-ref "refs/$origin" $(git-rev-parse HEAD) + t) origin_track="$remote_top/$head_points_at" + git-update-ref HEAD "$head_sha1" ;; + *) origin_track="$remote_top/$origin" + git-update-ref "refs/heads/$origin" "$head_sha1" ;; esac && - (cd "$GIT_DIR" && find "$remote_top" -type f -print) | - while read ref + echo >"$GIT_DIR/remotes/$origin" \ + "URL: $repo +Pull: refs/heads/$head_points_at:$origin_track" && + (cd "$GIT_DIR/$remote_top" && find . -type f -print) | + while read dotslref do - head=`expr "$ref" : 'refs/\(.*\)'` && - name=`expr "$ref" : 'refs/[^\/]*/\(.*\)'` && - test "$head_points_at" = "$name" || - test "$origin" = "$head" || + name=`expr "$dotslref" : './\(.*\)'` && + test "$use_separate_remote" = '' && { + test "$head_points_at" = "$name" || + test "$origin" = "$name" + } || echo "Pull: refs/heads/${name}:$remote_top/${name}" - done >>"$GIT_DIR/remotes/origin" + done >>"$GIT_DIR/remotes/$origin" && + case "$use_separate_remote" in + t) + rm -f "refs/remotes/$origin/HEAD" + git-symbolic-ref "refs/remotes/$origin/HEAD" \ + "refs/remotes/$origin/$head_points_at" + esac esac case "$no_checkout" in @@ -377,5 +413,5 @@ Pull: refs/heads/$head_points_at:refs/$origin" && fi rm -f "$GIT_DIR/CLONE_HEAD" "$GIT_DIR/REMOTE_HEAD" -trap - exit +trap - 0