threads / discuss / 51957

missing tags from "git fetch"

Subject: missing tags from "git fetch"

## tl;dr

5 messages between Oct 2, 2019 and Nov 22, 2019.

replies: 4people: 2as markdown or json

Martin Nicolay· Oct 2, 2019, 13:10 UTC · lore
Hi!

I don't know if this is a lack of understanding or a software or documentation bug.

man git-fetch says about tags:
        By default, any tag that points into the histories being fetched is
        also fetched; the effect is to fetch tags that point at branches that
        you are interested in.

If I fetch without --tags the tags that point to the commits of the fetched branch are not fetched. If I fetch with --tags than all tags are fetched but I only wish to fetch tags pointing to something in the branch fetched.

Here is a self contained example:
--------------------------
$ cd /tmp
$ git init r1 && cd r1
Initialized empty Git repository in /tmp/r1/.git/
$ date >f1
$ git add f1
$ git commit -minitial f1
[master (root-commit) 61753c60ac] initial
  1 file changed, 1 insertion(+)
  create mode 100644 f1
$ git tag -mt1 t1
$ git tag t2
$ git init ../r2 && cd ../r2
Initialized empty Git repository in /tmp/r2/.git/
$ git remote add origin $(cd ../r1; pwd)
$ git fetch origin master
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /tmp/r1
  * branch                  master     -> FETCH_HEAD
  * [new branch]            master     -> origin/master
$ git tag | wc
       0       0       0
$ git fetch --tags origin master
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (1/1), done.
From /tmp/r1
  * branch                  master     -> FETCH_HEAD
  * [new tag]               t1         -> t1
  * [new tag]               t2         -> t2
$ git tag | wc
       2       2       6
$ git rev-parse FETCH_HEAD
61753c60ac550a5315b7c930a701b94f36e08e4f
$ git rev-parse t1^{commit}
61753c60ac550a5315b7c930a701b94f36e08e4f
$ git rev-parse t2^{commit}
61753c60ac550a5315b7c930a701b94f36e08e4f
--------------------------

Obviously the two tags point to the fetched commit but without --tags they are not fetched. The behavior is identical for lightweight and annotated tags.

Best regards Martin Nicolay

-- 
No MS-Word attachments (http://www.gnu.org/philosophy/no-word-attachments.html)
_______________________________________________________________________________
OSM AG | Ruhrallee 191 | 45136 Essen | Fon: 0201-89 555 | Fax: 0201-89 55 400
web: www.osm-ag.de | e-mail: info@osm-ag.de
IBAN: DE67 4325 0030 0001 0059 82 | BIC: WELADED1HRN
USt-ldNr.: DE163337313 | HRB: 28171 Essen
Aufsichtsratsvorsitzende: Dipl.-Kff. Sabine Elsas
Vorstand: Johannes Kuhn (Vorsitzender), Christian Damsky, Axel Roland

--
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen.
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail.
Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist nicht
gestattet.
_______________________________________________________________________________
Jeff King· Oct 2, 2019, 13:55 UTC · re: Martin Nicolay · lore

Re: missing tags from "git fetch"

On Wed, Oct 02, 2019 at 03:10:12PM +0200, Martin Nicolay wrote:
Show 11 quoted lines
> I don't know if this is a lack of understanding or a software or
> documentation bug.
> 
> man git-fetch says about tags:
>        By default, any tag that points into the histories being fetched is
>        also fetched; the effect is to fetch tags that point at branches that
>        you are interested in.
> 
> If I fetch without --tags the tags that point to the commits of the fetched
> branch are not fetched. If I fetch with --tags than all tags are fetched but
> I only wish to fetch tags pointing to something in the branch fetched.

It's a documentation bug, I think. We won't auto-follow tags when fetching into FETCH_HEAD (but this is further confused by the fact that fetching into FETCH_HEAD will auto-update a tracking ref).

So instead of this:
> $ git fetch origin master
try this:
  $ git fetch origin
or even this:
  $ git fetch origin master:refs/remotes/origin/master

There's more discussion in this thread (but it looks like no patches ever came out of it):

  https://public-inbox.org/git/20170817092853.hteuzni5lxia4ejf@sigill.intra.peff.net/
-Peff
Martin Nicolay· Oct 2, 2019, 15:24 UTC · re: Jeff King · lore

Re: missing tags from "git fetch"

On Wednesday 2019-10-02 15:55, Jeff King wrote:
Show 7 quoted lines
> So instead of this:
>
>> $ git fetch origin master
>
> try this:
>
>  $ git fetch origin
It creates the master branch. This is what I'm trying to avoid.
> or even this:
>
>  $ git fetch origin master:refs/remotes/origin/master
Bingo. It's ugly but it works. Problem solved :-).
> There's more discussion in this thread (but it looks like no patches
> ever came out of it):
>
>  https://public-inbox.org/git/20170817092853.hteuzni5lxia4ejf@sigill.intra.peff.net/

The explanation makes a kind of sense, but if someone want to avoid polluting the tags when fetching into FETCH_HEAD one could get it with --no-tags. So this is more of a misguided attempt to get a seemingly sensible default while destroying a consistent behaviour.

Sometimes I can see why people say git is confusing ;-).

Thanks Martin Nicolay

-- 
No MS-Word attachments (http://www.gnu.org/philosophy/no-word-attachments.html)
_______________________________________________________________________________
OSM AG | Ruhrallee 191 | 45136 Essen | Fon: 0201-89 555 | Fax: 0201-89 55 400
web: www.osm-ag.de | e-mail: info@osm-ag.de
IBAN: DE67 4325 0030 0001 0059 82 | BIC: WELADED1HRN
USt-ldNr.: DE163337313 | HRB: 28171 Essen
Aufsichtsratsvorsitzende: Dipl.-Kff. Sabine Elsas
Vorstand: Johannes Kuhn (Vorsitzender), Christian Damsky, Axel Roland

--
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen.
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail.
Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist nicht
gestattet.
_______________________________________________________________________________
Martin Nicolay· Oct 25, 2019, 10:17 UTC · re: Jeff King · lore

Re: missing tags from "git fetch"

Hi!
On Wednesday 2019-10-02 15:55, Jeff King wrote:
Show 15 quoted lines
> It's a documentation bug, I think. We won't auto-follow tags when
> fetching into FETCH_HEAD (but this is further confused by the fact that
> fetching into FETCH_HEAD will auto-update a tracking ref).
>
> So instead of this:
>
>> $ git fetch origin master
>
> try this:
>
>  $ git fetch origin
>
> or even this:
>
>  $ git fetch origin master:refs/remotes/origin/master

I thought it would work, but it works only once. On the second time the ref for the remote branch is deleted. It seems git is confused by specifying a ref it expect to manage itself.

Is there any other way to force auto-follow tags? If there is no sane way, I have to create a throwawy branch and delete it immediately.

=====================================================
$ git fetch origin master:refs/remotes/origin/master
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From /tmp/r1
  * [new branch]            master     -> origin/master
  * [new tag]               t1         -> t1
  * [new tag]               t2         -> t2
$ ls .git/refs/remotes/origin
master
$ git fetch origin master:refs/remotes/origin/master
From /tmp/r1
  - [deleted]               (none)     -> origin/master
$ ls .git/refs/remotes/origin
/bin/ls: cannot access .git/refs/remotes/origin: No such file or directory
$ git fetch origin master:refs/remotes/origin/master
From /tmp/r1
  * [new branch]            master     -> origin/master
$ ls .git/refs/remotes/origin
master
$ git --version
git version 2.23.0
=====================================================

Best regards Martin Nicolay

-- 
_______________________________________________________________________________
No MS-Word attachments (http://www.gnu.org/philosophy/no-word-attachments.html)
_______________________________________________________________________________
OSM AG | Ruhrallee 191 | 45136 Essen | Fon: 0201-89 555 | Fax: 0201-89 55 400
web: www.osm-ag.de | e-mail: info@osm-ag.de
IBAN: DE67 4325 0030 0001 0059 82 | BIC: WELADED1HRN
USt-ldNr.: DE163337313 | HRB: 28171 Essen
Aufsichtsratsvorsitzende: Dipl.-Kff. Sabine Elsas
Vorstand: Johannes Kuhn (Vorsitzender), Christian Damsky, Axel Roland

--
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen.
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail.
Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist nicht
gestattet.
_______________________________________________________________________________
Jeff King· Nov 22, 2019, 13:00 UTC · re: Martin Nicolay · lore

Re: missing tags from "git fetch"

On Fri, Oct 25, 2019 at 12:17:26PM +0200, Martin Nicolay wrote:
Show 5 quoted lines
> >  $ git fetch origin master:refs/remotes/origin/master
> 
> I thought it would work, but it works only once. On the second time the ref
> for the remote branch is deleted. It seems git is confused by specifying a
> ref it expect to manage itself.

It seems like a bad interaction with `fetch.prune` (I don't have it set, and the problem doesn't appear, but if I set it, I can reproduce your issue).

I'm not sure why, though. It's true that the ref _is_ mentioned in the configured refspec for origin, but we shouldn't be looking at that refspec at all (since we have a refspec on the command line).

-Peff

← back to recent threads