diff options
-rwxr-xr-x | git-clone.sh | 29 | ||||
-rwxr-xr-x | t/t5700-clone-reference.sh | 40 |
2 files changed, 67 insertions, 2 deletions
diff --git a/git-clone.sh b/git-clone.sh index 4ddfa774ec..171099674d 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 dd9caad1c2..6d43252593 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 |