Skip to content

Commit 83c1379

Browse files
author
Junio C Hamano
committed
Merge branch 'jc/clone' into next
* jc/clone: revamp git-clone (take #2).
2 parents e2fc650 + 47874d6 commit 83c1379

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

git-clone.sh

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
unset CDPATH
1010

1111
usage() {
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);
6161
use File::Basename qw(dirname);
6262
my $git_dir = $ARGV[0];
6363
my $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");
6667
my $tag_top = "tags";
6768
6869
sub 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
166172
fi
167173

168-
if test -z "$origin_override$origin"
174+
if test -z "$origin"
169175
then
170-
if test -n "$use_separate_remote"
171-
then
172-
origin=remotes/master
173-
else
174-
origin=heads/origin
175-
fi
176+
origin=origin
176177
fi
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"
317318
if test -f "$GIT_DIR/CLONE_HEAD"
318319
then
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"
321322
fi
322323

323324
cd "$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

Comments
 (0)