mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
When using --reference to borrow objects from a neighbouring repository while cloning, we copy the entire set of refs under temporary "refs/reference-tmp/refs" space and set up the object alternates. However, a textual symref copied this way would not point at the right place, and causes later steps to emit error messages (which is harmless but still alarming). This is most visible when using a clone created with the separate-remote layout as a reference, because such a repository would have refs/remotes/origin/HEAD with 'ref: refs/remotes/origin/master' as its contents. Although we do not create symbolic-link based refs anymore, they have the same problem because they are always supposed to be relative to refs/ hierarchy (we dereference by hand, so it only is good for HEAD and nothing else). In either case, the solution is simply to remove them after copying under refs/reference-tmp; if a symref points at a true ref, that true ref itself is enough to ensure that objects reachable from it do not needlessly get fetched. Signed-off-by: Junio C Hamano <junkio@cox.net>
117 lines
2.3 KiB
Bash
Executable file
117 lines
2.3 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright (C) 2006 Martin Waitz <tali@admingilde.org>
|
|
#
|
|
|
|
test_description='test clone --reference'
|
|
. ./test-lib.sh
|
|
|
|
base_dir=`pwd`
|
|
|
|
test_expect_success 'preparing first repository' \
|
|
'test_create_repo A && cd A &&
|
|
echo first > file1 &&
|
|
git add file1 &&
|
|
git commit -m initial'
|
|
|
|
cd "$base_dir"
|
|
|
|
test_expect_success 'preparing second repository' \
|
|
'git clone A B && cd B &&
|
|
echo second > file2 &&
|
|
git add file2 &&
|
|
git commit -m addition &&
|
|
git repack -a -d &&
|
|
git prune'
|
|
|
|
cd "$base_dir"
|
|
|
|
test_expect_success 'cloning with reference (-l -s)' \
|
|
'git clone -l -s --reference B A C'
|
|
|
|
cd "$base_dir"
|
|
|
|
test_expect_success 'existence of info/alternates' \
|
|
'test `wc -l <C/.git/objects/info/alternates` = 2'
|
|
|
|
cd "$base_dir"
|
|
|
|
test_expect_success 'pulling from reference' \
|
|
'cd C &&
|
|
git pull ../B'
|
|
|
|
cd "$base_dir"
|
|
|
|
test_expect_success 'that reference gets used' \
|
|
'cd C &&
|
|
echo "0 objects, 0 kilobytes" > expected &&
|
|
git count-objects > current &&
|
|
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 &&
|
|
git add file3 &&
|
|
git commit -m update &&
|
|
git repack -a -d &&
|
|
git prune'
|
|
|
|
cd "$base_dir"
|
|
|
|
test_expect_success 'pulling changes from origin' \
|
|
'cd C &&
|
|
git pull origin'
|
|
|
|
cd "$base_dir"
|
|
|
|
# the 2 local objects are commit and tree from the merge
|
|
test_expect_success 'that alternate to origin gets used' \
|
|
'cd C &&
|
|
echo "2 objects" > expected &&
|
|
git count-objects | cut -d, -f1 > current &&
|
|
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
|