diff --git a/git-clone.sh b/git-clone.sh
index 4ddfa774ecf..171099674d1 100755
--- a/git-clone.sh
+++ b/git-clone.sh
@@ -190,7 +190,34 @@ then
 		(cd "$GIT_DIR/refs" &&
 		 mkdir reference-tmp &&
 		 cd reference-tmp &&
-		 tar xf -)
+		 tar xf - &&
+		 find refs ! -type d -print |
+		 while read ref
+		 do
+			if test -h "$ref"
+			then
+				# Old-style symbolic link ref.  Not likely
+				# to appear under refs/ but we might as well
+				# deal with them.
+				:
+			elif test -f "$ref"
+			then
+				point=$(cat "$ref") &&
+					case "$point" in
+					'ref: '*) ;;
+					*) continue ;;
+					esac
+			fi
+			# The above makes true ref to 'continue' and
+			# we will come here when we are looking at
+			# symbolic link ref or a textual symref (or
+			# garbage, like fifo).
+			# The true ref pointed at by it is enough to
+			# ensure that we do not fetch objects reachable
+			# from it.
+			rm -f "$ref"
+		 done
+		)
 	else
 		die "reference repository '$reference' is not a local directory."
 	fi
diff --git a/t/t5700-clone-reference.sh b/t/t5700-clone-reference.sh
index dd9caad1c2a..6d432525934 100755
--- a/t/t5700-clone-reference.sh
+++ b/t/t5700-clone-reference.sh
@@ -26,7 +26,7 @@ git prune'
 
 cd "$base_dir"
 
-test_expect_success 'cloning with reference' \
+test_expect_success 'cloning with reference (-l -s)' \
 'git clone -l -s --reference B A C'
 
 cd "$base_dir"
@@ -50,6 +50,28 @@ diff expected current'
 
 cd "$base_dir"
 
+test_expect_success 'cloning with reference (no -l -s)' \
+'git clone --reference B A D'
+
+cd "$base_dir"
+
+test_expect_success 'existence of info/alternates' \
+'test `wc -l <D/.git/objects/info/alternates` = 1'
+
+cd "$base_dir"
+
+test_expect_success 'pulling from reference' \
+'cd D && git pull ../B'
+
+cd "$base_dir"
+
+test_expect_success 'that reference gets used' \
+'cd D && echo "0 objects, 0 kilobytes" > expected &&
+git count-objects > current &&
+diff expected current'
+
+cd "$base_dir"
+
 test_expect_success 'updating origin' \
 'cd A &&
 echo third > file3 &&
@@ -75,4 +97,20 @@ diff expected current'
 
 cd "$base_dir"
 
+test_expect_success 'pulling changes from origin' \
+'cd D &&
+git pull origin'
+
+cd "$base_dir"
+
+# the 5 local objects are expected; file3 blob, commit in A to add it
+# and its tree, and 2 are our tree and the merge commit.
+test_expect_success 'check objects expected to exist locally' \
+'cd D &&
+echo "5 objects" > expected &&
+git count-objects | cut -d, -f1 > current &&
+diff expected current'
+
+cd "$base_dir"
+
 test_done