X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-clone.sh;h=c013e481d044b3b11155d970f785766bc4c18613;hb=475443c8489d9167b944367d8ec8bfef77bee0a5;hp=9db678beef97db1027389badf29a3ecf60659187;hpb=16563132977287314fa25348d97d0ffbe019442b;p=git.git diff --git a/git-clone.sh b/git-clone.sh index 9db678be..c013e481 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 [--use-separate-remote] [--reference ] [--bare] [-l [-s]] [-q] [-u ] [--origin ] [-n] []" exit 1 } @@ -45,14 +45,15 @@ Perhaps git-update-server-info needs to be run there?" if test -n "$use_separate_remote" && branch_name=`expr "$name" : 'heads/\(.*\)'` 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,6 +99,7 @@ close FH; ' quiet= +local=no use_local=no local_shared=no no_checkout= @@ -120,19 +123,25 @@ while *,-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 +158,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 +181,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 @@ -316,20 +325,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 "$head_sha1" : 'ref: 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 +371,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