On 07/09, Jonathan Nieder wrote:
> Hi,
>
> Jonathan Tan wrote:
>
> > --- a/builtin/fetch.c
> > +++ b/builtin/fetch.c
> > @@ -359,7 +359,7 @@ static struct ref *get_ref_map(struct transport
> > *transport,
> > refspec_ref_prefixes(&transport->remote->fetch, &ref_prefixes);
> >
> > if (ref_prefixes.argc &&
> > - (tags == TAGS_SET || (tags == TAGS_DEFAULT && !rs->nr))) {
> > + (tags == TAGS_SET || tags == TAGS_DEFAULT)) {
>
> Makes a lot of sense.
>
> This means that if I run
>
> git fetch origin master
>
> then the ls-refs step will now include refs/tags/* in addition to
> refs/heads/master, erasing some of the gain that protocol v2 brought.
> But since the user didn't pass --no-tags, that is what the user asked
> for.
>
> One could argue that the user didn't *mean* to ask for that. In other
> words, I wonder if the following would better match the user intent:
>
> - introduce a new tagopt value, --tags=auto or something, that means
> that tags are only followed when no refspec is supplied. In other
> words,
>
> git fetch --tags=auto <remote>
>
> would perform tag auto-following, while
>
> git fetch --tags=auto <remote> <branch>
>
> would act like fetch --no-tags.
>
> - make --tags=auto the default for new clones.
>
> What do you think?
>
> Some related thoughts on tag auto-following:
>
> It would be tempting to not use tag auto-following at all in the
> default configuration and just include refs/tags/*:refs/tags/* in the
> default clone refspec. Unfortunately, that would be a pretty
> significant behavior change from the present behavior, since
>
> - it would fetch tags pointing to objects unrelated to the fetched
> history
> - if we have ref-in-want *with* pattern support, it would mean we
> try to fetch all tags on every fetch. As discussed in the
> thread [1], this is expensive and difficult to get right.
> - if an unannotated tag is fast-forwarded, it would allow existing
> tags to be updated
> - it interacts poorly with --prune
> - ...
>
> I actually suspect it's a good direction in the long term, but until
> we address those downsides (see also the occasional discussions on tag
> namespaces), we're not ready for it. The --tags=auto described above
> is a sort of half approximation.
>
> Anyway, this is all a long way of saying that despite the performance
> regression I believe this patch heads in the right direction. The
> performance regression is inevitable in what the user is
> (unintentionally) requesting, and we can address it separately by
> changing the defaults to better match what the user intends to
> request.
I agree with this observation, though I'm a bit sad about it. I think
that having tag auto-following the default is a little confusing (and
hurts perf[1] when using proto v2) but since thats the way its always been
we'll have to live with it for now. I think exploring changing the
defaults might be a good thing to do in the future. But for now we've
had enough people comment on this lacking functionality that we should
fix it.
[1] Thankfully it doesn't completely undo what protocol v2 did, as we
still are able to eliminate refs/changes or refs/pull or other various
refs which significantly add to the number of refs advertised during
fetch.
--
Brandon Williams