X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-clone.sh;h=823c74b9139d4a77eb5430674bf0237fb573c14c;hb=53909056da869eb79c2a20699794b63c8c87e7fd;hp=9db678beef97db1027389badf29a3ecf60659187;hpb=dfeff66ed9a3931d60f3cd600ad8c14b5cc3d9e5;p=git.git diff --git a/git-clone.sh b/git-clone.sh index 9db678be..823c74b9 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,7 +45,7 @@ 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 @@ -61,8 +61,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 +98,7 @@ close FH; ' quiet= +local=no use_local=no local_shared=no no_checkout= @@ -120,19 +122,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 +157,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 +180,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 @@ -317,7 +325,7 @@ 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" + perl -e "$copy_refs" "$GIT_DIR" "$use_separate_remote" "$origin" fi cd "$D" || exit @@ -328,8 +336,18 @@ then # 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 + + # What to use to track the remote primary branch + if test -n "$use_separate_remote" + then + origin_tracking="remotes/$origin/master" + else + origin_tracking="heads/$origin" + fi + + # The name under $remote_top the remote HEAD seems to point at head_points_at=$( ( echo "master" @@ -349,25 +367,32 @@ then done ) ) + + # Write out remotes/$origin file. case "$head_points_at" in ?*) mkdir -p "$GIT_DIR/remotes" && - echo >"$GIT_DIR/remotes/origin" \ + echo >"$GIT_DIR/remotes/$origin" \ "URL: $repo -Pull: refs/heads/$head_points_at:refs/$origin" && +Pull: refs/heads/$head_points_at:refs/$origin_tracking" && case "$use_separate_remote" in t) git-update-ref HEAD "$head_sha1" ;; - *) git-update-ref "refs/$origin" $(git-rev-parse HEAD) + *) git-update-ref "refs/heads/$origin" $(git-rev-parse HEAD) ;; esac && - (cd "$GIT_DIR" && find "$remote_top" -type f -print) | - while read ref + (cd "$GIT_DIR/$remote_top" && find . -type f -print) | + while read dotslref do - head=`expr "$ref" : 'refs/\(.*\)'` && - name=`expr "$ref" : 'refs/[^\/]*/\(.*\)'` && + name=`expr "$dotslref" : './\(.*\)'` && test "$head_points_at" = "$name" || - test "$origin" = "$head" || + 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