threads / discuss / 32329

unclear documentation of git fetch --tags option and tagopt config

Subject: unclear documentation of git fetch --tags option and tagopt config

## tl;dr

4 messages between Dec 13, 2012 and Dec 14, 2012.

replies: 3people: 3as markdown or json

乙酸鋰· Dec 13, 2012, 06:29 UTC · lore
Hi,

With git fetch --tags or remote.origin.tagopt = --tags git fetch only fetches tags, but not branches. Current documentation does not mention that no branches are fetched / pulled when --tags option or remote.origin.tagopt = --tags is specified.

Regards, ch3cooli

Junio C Hamano· Dec 13, 2012, 18:44 UTC · re: 乙酸鋰 · lore

Re: unclear documentation of git fetch --tags option and tagopt config

乙酸鋰 <ch3cooli@gmail.com> writes:
Show 6 quoted lines
> With git fetch --tags
> or remote.origin.tagopt = --tags
> git fetch only fetches tags, but not branches.
> Current documentation does not mention that no branches are fetched /
> pulled when --tags option or remote.origin.tagopt = --tags is
> specified.

In the canonical form you spell out what you want to fetch from where, and a lazy "git fetch" or "git fetch origin" that does not specify what are to be fetched are the special cases. Because they do not say what to fetch, they would become a no-op, which would not be very useful, if there is no special casing for them. Instead, they use sensible default, taking refspec from the configuration variable remote.$name.fetch.

Giving refspecs or the "--tags" option from the command line is a way to explicitly override this default, hence:

    $ git fetch origin HEAD

only fetches the history leading to the commit at HEAD at the remote, ignoring the configured refspecs. As "--tags" is a synonym to "refs/tags/*:refs/tags/*", "git fetch --tags origin" tells us to ignore refspecs and grab only the tags, i.e.:

    $ git fetch origin "refs/tags/*:refs/tags/*"
which does not grab any branches.
You can of course do:
    $ git fetch --tags origin refs/heads/master:refs/remotes/origin/master
Philip Oakley· Dec 13, 2012, 23:47 UTC · re: Junio C Hamano · lore

Re: unclear documentation of git fetch --tags option and tagopt config

From: "Junio C Hamano" <gitster@pobox.com> Sent: Thursday, December 13, 
2012 6:44 PM
Show 37 quoted lines
> 乙酸鋰 <ch3cooli@gmail.com> writes:
>
>> With git fetch --tags
>> or remote.origin.tagopt = --tags
>> git fetch only fetches tags, but not branches.
>> Current documentation does not mention that no branches are fetched /
>> pulled when --tags option or remote.origin.tagopt = --tags is
>> specified.
>
> In the canonical form you spell out what you want to fetch from
> where, and a lazy "git fetch" or "git fetch origin" that does not
> specify what are to be fetched are the special cases.  Because they
> do not say what to fetch, they would become a no-op, which would not
> be very useful, if there is no special casing for them.  Instead,
> they use sensible default, taking refspec from the configuration
> variable remote.$name.fetch.
>
> Giving refspecs or the "--tags" option from the command line is a
> way to explicitly override this default, hence:
>
>    $ git fetch origin HEAD
>
> only fetches the history leading to the commit at HEAD at the
> remote, ignoring the configured refspecs.  As "--tags" is a synonym
> to "refs/tags/*:refs/tags/*", "git fetch --tags origin" tells us to
> ignore refspecs and grab only the tags, i.e.:
>
>    $ git fetch origin "refs/tags/*:refs/tags/*"
>
> which does not grab any branches.
>
> You can of course do:
>
>    $ git fetch --tags origin 
> refs/heads/master:refs/remotes/origin/master
>
> --

What would be the best way of updating the documentation to clarify the point? Given ch3cooli's previous surprise.

Junio C Hamano· Dec 14, 2012, 00:13 UTC · re: Philip Oakley · lore

Re: unclear documentation of git fetch --tags option and tagopt config

"Philip Oakley" <philipoakley@iee.org> writes:
> What would be the best way of updating the documentation to clarify the 
> point? Given ch3cooli's previous surprise.

Oh, thanks for bringing it up. I was about to start another message that begins with "Having said all that..." ;-)

I think the entire paragraph should be rewritten. The first long sentence explains that you will get tags that point at the branches and other stuff you follow by default, so there is no need to explicitly ask for tags most of the time. While that is true, it is secondary in describing what "--tags" is about. It is to grab all tags and store them locally, and that needs to come at the very beginning.

And that auto-following behaviour is already described in the previous entry for -n/--no-tags. So how about something like this:

	This is a short-hand for giving "refs/tags/*:refs/tags/*"
	refspec from the command line, to ask all tags to be fetched
	and stored locally.

Note that it is deliberate that the above does not mention tagopt configuration at all. The variable was primarily meant to be used with --no-tags, so that with this:

    [remote "origin"] tagopt = --no-tags

you can "git fetch origin" to keep up with the development on branches without having to fetch tags from there. Fetching tags and only tags from a remote is almost always not what you want; in other words, remote."origin".tagopt set to --tags is a misconfiguration 99% of the time, unless you are only interested in following tagged release points.

← back to recent threads