Skip to content

Commit e9502c0

Browse files
peffgitster
authored andcommitted
fetch-pack: don't try to fetch peel values with --all
When "fetch-pack --all" sees a tag-to-blob on the remote, it tries to fetch both the tag itself ("refs/tags/foo") and the peeled value that the remote advertises ("refs/tags/foo^{}"). Asking for the object pointed to by the latter can cause upload-pack to complain with "not our ref", since it does not mark the peeled objects with the OUR_REF (unless they were at the tip of some other ref). Arguably upload-pack _should_ be marking those peeled objects. But it never has in the past, since clients would generally just ask for the tag and expect to get the peeled value along with it. And that's how "git fetch" works, as well as older versions of "fetch-pack --all". The problem was introduced by 5f0fc64 (fetch-pack: eliminate spurious error messages, 2012-09-09). Before then, the matching logic was something like: if (refname is ill-formed) do nothing else if (doing --all) always consider it matched else look through list of sought refs for a match That commit wanted to flip the order of the second two arms of that conditional. But we ended up with: if (refname is ill-formed) do nothing else look through list of sought refs for a match if (--all and no match so far) always consider it matched That means tha an ill-formed ref will trigger the --all conditional block, even though we should just be ignoring it. We can fix that by having a single "else" with all of the well-formed logic, that checks the sought refs and "--all" in the correct order. Reported-by: Kirill Smelkov <[email protected]> Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 39aaab1 commit e9502c0

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

fetch-pack.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -582,11 +582,11 @@ static void filter_refs(struct fetch_pack_args *args,
582582
}
583583
i++;
584584
}
585-
}
586585

587-
if (!keep && args->fetch_all &&
588-
(!args->deepen || !starts_with(ref->name, "refs/tags/")))
589-
keep = 1;
586+
if (!keep && args->fetch_all &&
587+
(!args->deepen || !starts_with(ref->name, "refs/tags/")))
588+
keep = 1;
589+
}
590590

591591
if (keep) {
592592
*newtail = ref;

t/t5500-fetch-pack.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,16 @@ test_expect_success 'test --all, --depth, and explicit tag' '
518518
) >out-adt 2>error-adt
519519
'
520520

521+
test_expect_success 'test --all with tag to non-tip' '
522+
git commit --allow-empty -m non-tip &&
523+
git commit --allow-empty -m tip &&
524+
git tag -m "annotated" non-tip HEAD^ &&
525+
(
526+
cd client &&
527+
git fetch-pack --all ..
528+
)
529+
'
530+
521531
test_expect_success 'shallow fetch with tags does not break the repository' '
522532
mkdir repo1 &&
523533
(

0 commit comments

Comments
 (0)