From: Taylor Blau <me@ttaylorr.com>
To: Igor Todorovski <itodorov@ca.ibm.com>
Cc: Bence Ferdinandy <bence@ferdinandy.com>,
Junio C Hamano <gitster@pobox.com>,
Jonathan Tan <jonathantanmy@google.com>,
"git@vger.kernel.org" <git@vger.kernel.org>
Subject: Re: Tags are no longer fetched when fetching specific commit
Date: Thu, 13 Feb 2025 17:38:18 -0500 [thread overview]
Message-ID: <Z650WoqFwCSo6svH@nand.local> (raw)
In-Reply-To: <71075837-D0AA-4F01-9F5D-CA10BFE93B63@ca.ibm.com>
On Thu, Jan 30, 2025 at 03:49:20AM +0000, Igor Todorovski wrote:
> Hi, we have noticed a change in behaviour with commit 3f763ddf28d28fe63963991513c8db4045eabadc.
>
> Here’s the steps to reproduce:
>
> mkdir git-test-dir
> cd git-test-dir
> git init --bare
> git remote add origin -- https://github.com/golang/go
> git -c protocol.version=2 fetch -f --depth=1 origin 16afa6a740fac7442e94dcd2ec5ea4a4853e45dc:refs/dummy
> git -c log.showsignature=false log --no-decorate -n1 --format="format:%H %ct %D" 16afa6a740fac7442e94dcd2ec5ea4a4853e45dc --
>
> # Expected:
> # 16afa6a740fac7442e94dcd2ec5ea4a4853e45dc 1734108730 grafted, tag: go1.24rc1, refs/dummy
>
> # Tags are not fetch when using 2.48.1:
> # 16afa6a740fac7442e94dcd2ec5ea4a4853e45dc 1734108730 grafted
>
> ---
>
> git bisect revealed 3f763ddf28d28fe63963991513c8db4045eabadc as the culprit:
>
> commit 3f763ddf28d28fe63963991513c8db4045eabadc
> Author: Bence Ferdinandy
> Date: Fri Nov 22 13:28:50 2024 +0100
>
> fetch: set remote/HEAD if it does not exist
>
> When cloning a repository remote/HEAD is created, but when the user
> creates a repository with git init, and later adds a remote, remote/HEAD
> is only created if the user explicitly runs a variant of "remote
> set-head". Attempt to set remote/HEAD during fetch, if the user does not
> have it already set. Silently ignore any errors.
>
> Signed-off-by: Bence Ferdinandy bence@ferdinandy.com
> Signed-off-by: Junio C Hamano gitster@pobox.com
>
Thanks for the report and bisection recipe. I was able to bisect the
same issue myself, and also found myself at 3f763ddf28 (fetch: set
remote/HEAD if it does not exist, 2024-11-22).
> Is this intended?
I don't think this was intentional, though the commit's author Bence
(CC'd) can confirm.
I suspect what's going on here is that in 3f763ddf28 and onwards we are
explicitly adding "HEAD" to the list of ref_prefixes, which causes the
server to respond only to the prefixes being asked for. In a
pre-3f763ddf28 world, the ref_prefixes list would be empty (if invoked
according to your script above), which allowed us to learn about any
tags pointing at that commit.
One way to fix it is to move adding the "HEAD" prefix to above where we
check
if (tags == TAGS_SET || tags == TAGS_DEFAULT)
, which would allow us to enter the inner-most conditional which guards
us actually adding the refs/tags prefix to our list.
But I don't love that solution, and I think even that is incomplete
since as of 6c915c3f85 (fetch: do not ask for HEAD unnecessarily,
2024-12-06) we only ask for "HEAD" if we have a remote in the first
place.
I think the real culprit is that we can no longer hold the same
assumption from e70a3030e7 (fetch: do not list refs if fetching only
hashes, 2018-09-27), which is that we can avoid asking for refs/tags as
an explicit prefix if we're (a) fetching literal hashes, (b) tag
following wasn't requested, and (c) the fetch is done with protocol v2.
So I think the right fix would really be something like:
--- 8< ---
diff --git a/builtin/fetch.c b/builtin/fetch.c
index fe2b26c74a..0e63621e6c 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1770,9 +1770,8 @@ static int do_fetch(struct transport *transport,
if (tags == TAGS_SET || tags == TAGS_DEFAULT) {
must_list_refs = 1;
- if (transport_ls_refs_options.ref_prefixes.nr)
- strvec_push(&transport_ls_refs_options.ref_prefixes,
- "refs/tags/");
+ strvec_push(&transport_ls_refs_options.ref_prefixes,
+ "refs/tags/");
}
if (uses_remote_tracking(transport, rs)) {
--- >8 ---
But I'm unfamiliar enough with this area that I'd appreciate comments
from the authors of these various commits, all of whom have been CC'd.
Does this seem right to you, or am I totally down the wrong path?
Thanks,
Taylor
next prev parent reply other threads:[~2025-02-13 22:38 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-30 3:49 Tags are no longer fetched when fetching specific commit Igor Todorovski
2025-02-13 22:38 ` Taylor Blau [this message]
2025-02-14 13:53 ` Bence Ferdinandy
2025-02-14 18:35 ` Junio C Hamano
2025-02-21 7:25 ` Jeff King
2025-03-07 23:27 ` [PATCH] fetch: fix following tags when fetching specific OID Taylor Blau
2025-03-07 23:32 ` Taylor Blau
2025-03-08 0:10 ` Junio C Hamano
2025-03-08 3:23 ` Bence Ferdinandy
2025-03-09 3:01 ` [PATCH 0/9] fetch: further ref-prefix cleanups and optimizations Jeff King
2025-03-09 3:01 ` [PATCH 1/9] t5702: fix typo in test name Jeff King
2025-03-12 21:30 ` Taylor Blau
2025-03-13 5:37 ` Jeff King
2025-03-09 3:01 ` [PATCH 2/9] t5516: prefer "oid" to "sha1" in some test titles Jeff King
2025-03-09 3:02 ` [PATCH 3/9] t5516: drop NEEDSWORK about v2 reachability behavior Jeff King
2025-03-12 21:30 ` Taylor Blau
2025-03-09 3:02 ` [PATCH 4/9] t5516: beef up exact-oid ref prefixes test Jeff King
2025-03-09 3:07 ` [PATCH 5/9] refspec_ref_prefixes(): clean up refspec_item logic Jeff King
2025-03-12 21:38 ` Taylor Blau
2025-03-13 5:41 ` Jeff King
2025-03-13 13:26 ` Junio C Hamano
2025-03-17 22:24 ` [PATCH 0/4] refspec: treat 'fetch' as a Boolean value Taylor Blau
2025-03-17 22:24 ` [PATCH 1/4] " Taylor Blau
2025-03-18 0:24 ` Jeff King
2025-03-18 0:26 ` Jeff King
2025-03-18 22:44 ` Taylor Blau
2025-03-17 22:24 ` [PATCH 2/4] refspec: replace `refspec_init()` with fetch/push variants Taylor Blau
2025-03-17 22:24 ` [PATCH 3/4] refspec: remove refspec_item_init_or_die() Taylor Blau
2025-03-17 22:24 ` [PATCH 4/4] refspec: replace `refspec_item_init()` with fetch/push variants Taylor Blau
2025-03-17 23:26 ` [PATCH 0/4] refspec: treat 'fetch' as a Boolean value Junio C Hamano
2025-03-18 22:40 ` Taylor Blau
2025-03-18 22:50 ` [PATCH v2 " Taylor Blau
2025-03-18 22:50 ` [PATCH v2 1/4] " Taylor Blau
2025-03-18 22:50 ` [PATCH v2 2/4] refspec: replace `refspec_init()` with fetch/push variants Taylor Blau
2025-03-18 22:50 ` [PATCH v2 3/4] refspec: remove refspec_item_init_or_die() Taylor Blau
2025-03-18 22:50 ` [PATCH v2 4/4] refspec: replace `refspec_item_init()` with fetch/push variants Taylor Blau
2025-03-19 15:31 ` [PATCH v2 0/4] refspec: treat 'fetch' as a Boolean value Elijah Newren
2025-03-17 22:00 ` [PATCH 5/9] refspec_ref_prefixes(): clean up refspec_item logic Taylor Blau
2025-03-17 23:25 ` Junio C Hamano
2025-03-18 22:47 ` Taylor Blau
2025-03-09 3:08 ` [PATCH 6/9] fetch: ask server to advertise HEAD for config-less fetch Jeff King
2025-03-12 21:43 ` Taylor Blau
2025-03-13 5:46 ` Jeff King
2025-03-13 12:26 ` Junio C Hamano
2025-03-17 22:23 ` Taylor Blau
2025-03-09 3:10 ` [PATCH 7/9] fetch: stop protecting additions to ref-prefix list Jeff King
2025-03-12 21:45 ` Taylor Blau
2025-03-09 3:20 ` [PATCH 8/9] fetch: avoid ls-refs only to ask for HEAD symref update Jeff King
2025-03-13 15:53 ` Junio C Hamano
2025-03-17 18:06 ` Jeff King
2025-03-17 19:01 ` Junio C Hamano
2025-03-18 5:39 ` [PATCH 0/2] limiting followRemoteHEAD being used Jeff King
2025-03-18 5:40 ` [PATCH 1/2] fetch: only respect followRemoteHEAD with configured refspecs Jeff King
2025-03-18 23:02 ` Taylor Blau
2025-03-18 5:41 ` [PATCH 2/2] fetch: don't ask for remote HEAD if followRemoteHEAD is "never" Jeff King
2025-03-18 19:18 ` [PATCH 0/2] limiting followRemoteHEAD being used Junio C Hamano
2025-03-18 23:02 ` Taylor Blau
2025-03-09 3:21 ` [PATCH 9/9] fetch: use ref prefix list to skip ls-refs Jeff King
2025-03-12 21:29 ` [PATCH 0/9] fetch: further ref-prefix cleanups and optimizations Taylor Blau
2025-03-12 21:49 ` Taylor Blau
2025-03-13 5:50 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z650WoqFwCSo6svH@nand.local \
--to=me@ttaylorr.com \
--cc=bence@ferdinandy.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=itodorov@ca.ibm.com \
--cc=jonathantanmy@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).