99unset CDPATH
1010
1111usage () {
12- echo >&2 " Usage: $0 [--reference <reference-repo>] [--bare] [-l [-s]] [-q] [-u <upload-pack>] [-o <name>] [-n] <repo> [<dir>]"
12+ echo >&2 " Usage: $0 [--use-separate-remote] [-- reference <reference-repo>] [--bare] [-l [-s]] [-q] [-u <upload-pack>] [-o <name>] [-n] <repo> [<dir>]"
1313 exit 1
1414}
1515
@@ -61,8 +61,9 @@ use File::Path qw(mkpath);
6161use File::Basename qw(dirname);
6262my $git_dir = $ARGV[0];
6363my $use_separate_remote = $ARGV[1];
64+ my $origin = $ARGV[2];
6465
65- my $branch_top = ($use_separate_remote ? "remotes" : "heads");
66+ my $branch_top = ($use_separate_remote ? "remotes/$origin " : "heads");
6667my $tag_top = "tags";
6768
6869sub store {
@@ -127,7 +128,12 @@ while
127128 * ,--reference=* )
128129 reference=` expr " $1 " : ' --reference=\(.*\)' ` ;;
129130 * ,-o)
130- git-check-ref-format " $2 " || {
131+ case " $2 " in
132+ * /* )
133+ echo >&2 " '$2 ' is not suitable for an origin name"
134+ exit 1
135+ esac
136+ git-check-ref-format " heads/$2 " || {
131137 echo >&2 " '$2 ' is not suitable for a branch name"
132138 exit 1
133139 }
@@ -165,14 +171,9 @@ then
165171 no_checkout=yes
166172fi
167173
168- if test -z " $origin_override$ origin "
174+ if test -z " $origin "
169175then
170- if test -n " $use_separate_remote "
171- then
172- origin=remotes/master
173- else
174- origin=heads/origin
175- fi
176+ origin=origin
176177fi
177178
178179# Turn the source into an absolute path if
@@ -317,7 +318,7 @@ test -d "$GIT_DIR/refs/reference-tmp" && rm -fr "$GIT_DIR/refs/reference-tmp"
317318if test -f " $GIT_DIR /CLONE_HEAD"
318319then
319320 # Figure out where the remote HEAD points at.
320- perl -e " $copy_refs " " $GIT_DIR " " $use_separate_remote "
321+ perl -e " $copy_refs " " $GIT_DIR " " $use_separate_remote " " $origin "
321322fi
322323
323324cd " $D " || exit
@@ -328,8 +329,18 @@ then
328329 # Figure out which remote branch HEAD points at.
329330 case " $use_separate_remote " in
330331 ' ' ) remote_top=refs/heads ;;
331- * ) remote_top=refs/remotes ;;
332+ * ) remote_top=" refs/remotes/ $origin " ;;
332333 esac
334+
335+ # What to use to track the remote primary branch
336+ if test -n " $use_separate_remote "
337+ then
338+ origin_tracking=" remotes/$origin /master"
339+ else
340+ origin_tracking=" heads/$origin "
341+ fi
342+
343+ # The name under $remote_top the remote HEAD seems to point at
333344 head_points_at=$(
334345 (
335346 echo " master"
@@ -349,25 +360,26 @@ then
349360 done
350361 )
351362 )
363+
364+ # Write out remotes/$origin file.
352365 case " $head_points_at " in
353366 ?* )
354367 mkdir -p " $GIT_DIR /remotes" &&
355- echo > " $GIT_DIR /remotes/origin" \
368+ echo > " $GIT_DIR /remotes/$ origin" \
356369 " URL: $repo
357- Pull: refs/heads/$head_points_at :refs/$origin " &&
370+ Pull: refs/heads/$head_points_at :refs/$origin_tracking " &&
358371 case " $use_separate_remote " in
359372 t) git-update-ref HEAD " $head_sha1 " ;;
360373 * ) git-update-ref " refs/$origin " $( git-rev-parse HEAD)
361374 esac &&
362- (cd " $GIT_DIR " && find " $remote_top " -type f -print) |
363- while read ref
375+ (cd " $GIT_DIR / $remote_top " && find . -type f -print) |
376+ while read dotslref
364377 do
365- head=` expr " $ref " : ' refs/\(.*\)' ` &&
366- name=` expr " $ref " : ' refs/[^\/]*/\(.*\)' ` &&
378+ name=` expr " $dotslref " : ' ./\(.*\)' ` &&
367379 test " $head_points_at " = " $name " ||
368380 test " $origin " = " $head " ||
369381 echo " Pull: refs/heads/${name} :$remote_top /${name} "
370- done >> " $GIT_DIR /remotes/origin"
382+ done >> " $GIT_DIR /remotes/$ origin"
371383 esac
372384
373385 case " $no_checkout " in
0 commit comments