git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Friendly refspecs (Was: Re: git annoyances)

From
Jeff King <peff@peff.net>
Date
Apr 9, 2008, 20:34 UTC
Message-ID
<20080409203453.GA10370@sigill.intra.peff.net>
In-Reply-To
<20080409200836.GA19248@mithlond>
On Wed, Apr 09, 2008 at 11:08:36PM +0300, Teemu Likonen wrote:
Show 14 quoted lines
> seem quite unnecessary hackerish. Pull and push work pretty nicely
> without knowing about any refs/* stuff; they can be operated with simple
> branch names. Fetch is another story. Some ideas:
> 
>   $ git fetch <URL>
> 
> would be equivalent to
> 
>   $ git fetch <URL> +refs/heads/*:refs/remotes/<name>/*
> 
> In other words, fetch all the branches from remote repo and store them
> locally as remote tracking branches to <name>/ hieararchy. The <name> is
> the last component taken from the <URL> (maybe "origin" if it can't be
> detected).

This has been discussed before and rejected, because the point of doing a fetch of a URL (rather than a remote name) is to do a "one-off" thing. IOW, you don't _want_ the tracking branches, as they will just clutter your branch space (plus choosing the last component is a bad heuristic; lots of people must ask Linus to pull from their .../linux-2.6 repository).

Almost nobody says "git fetch <URL>"; it is just a subpart of "git pull <URL>" which is intended for one-off merges (i.e., you are not tracking somebody over the long term, you just want to grab their work and merge it).

> Currently "git fetch <URL>" does not seem to do anything useful for
> non-git-hackers. It seems to fetch objects but not create any branches
> referring to them. As a comparison, let's configure a remote and run

It does; it puts the refs into FETCH_HEAD. Maybe a status table like the usual one would be more informative, like:

  From git://host/path/to/repo
   * [new branch]      foo -> FETCH_HEAD

though again, it would help if we could see a workflow that uses "git fetch <URL>" for something. I think the simplest answer in your case is "don't use git fetch <URL>".

Show 7 quoted lines
> similar fetch command without any refspecs explicitly named:
> 
>   $ git remote add <name> <URL>
>   $ git fetch <name>
> 
> Now this fetch really creates all the branches (as defined in
> remote.<name>.fetch) which is nice and the way Git currently works.

Sure. There is an explicit design decision that "because you gave this thing a nickname, you are probably interested in keeping its tracking branches around."

Show 7 quoted lines
> Some more ideas for simple refspecs:
> 
>   $ git fetch <URL|name> <branch>
> 
> would be equivalent to
> 
>   $ git fetch <URL|name> +refs/heads/<branch>:refs/remotes/<name>/<branch>

It would probably be nice if "git fetch name foo" saved the remote tracking branch remotes/name/foo, which it doesn't currently. But whether to do it with a URL is orthogonal; it depends on whether we use tracking branches for URLs in general, as you suggested above.

Show 5 quoted lines
>   $ git fetch <URL|name> <Rbranch>:<Lbranch>
> 
> would be equivalent to
> 
>   $ git fetch <URL|name> +refs/heads/<Rbranch>:refs/remotes/<Lbranch>
We almost have that. It's actually spelled:
  git fetch <URL|name> <Rbranch>:remotes/<Lbranch>

But again, what is the workflow? There are generally two ways of fetching:

  1. I am tracking some remote with multiple branches. I give it a
     remote name (either by editing the config file or by using
     git-remote). When i want to get updates, I do "git fetch <name>",
     and then I can work with the <name>/* branches as I want (diffing,
     merging, etc).
  2. "Somehow" I found out about something interesting in a particular
     branch of a particular repo. I want to pull that in to see the
     work, so I use "git pull <repo> <branch>". Alternatively, if I
     prefer to fetch and examine before pulling (even though the merge
     can of course be cancelled easily), I can "git fetch <repo>
     <branch>", followed by "git diff HEAD FETCH_HEAD", followed by "git
     merge FETCH_HEAD".

It seems like you are getting caught up on using "git fetch" in different ways that don't really make sense to its original use. So the problem is not so much one of "fetch doesn't do what I want it to do" as much as "it is easy to be confused about what it is I want to do."

-Peff
Previous: Avery PennarunNext: Teemu Likonen
Message 15 of 86 in “git annoyances”
  1. Ingo MolnarApr 9, 2008
  2. Björn SteinbrinkApr 9, 2008
  3. Jeff KingApr 9, 2008
  4. git-remote: show all remotes with "git remote show"Jeff King, Apr 9, 2008
  5. Johannes SchindelinApr 9, 2008
  6. Junio C HamanoApr 10, 2008
  7. Ingo MolnarApr 9, 2008
  8. Ingo MolnarApr 10, 2008
  9. Avery PennarunApr 9, 2008
  10. Karl HasselströmApr 10, 2008
  11. Avery PennarunApr 10, 2008
  12. Karl HasselströmApr 11, 2008
  13. Friendly refspecs (Was: Re: git annoyances)Teemu Likonen, Apr 9, 2008
  14. Avery PennarunApr 9, 2008
  15. Jeff KingApr 9, 2008
  16. Teemu LikonenApr 9, 2008
  17. Jeff KingApr 9, 2008
  18. Jeff KingApr 10, 2008
  19. Jeff KingApr 10, 2008
  20. Junio C HamanoApr 10, 2008
  21. Jeff KingApr 10, 2008
  22. Teemu LikonenApr 13, 2008
  23. Add examples section to 'git fetch' manualTeemu Likonen, Apr 13, 2008
  24. Junio C HamanoApr 13, 2008
  25. Matt GrahamApr 13, 2008
  26. Teemu LikonenApr 13, 2008
  27. Junio C HamanoApr 14, 2008
  28. Jeff KingApr 16, 2008
  29. Jeff KingApr 16, 2008
  30. Junio C HamanoApr 16, 2008
  31. Jeff KingApr 16, 2008
  32. Daniel BarkalowApr 16, 2008
  33. Junio C HamanoApr 16, 2008
  34. Jeff KingApr 22, 2008
  35. Junio C HamanoApr 22, 2008
  36. Daniel BarkalowApr 22, 2008
  37. Jeff KingApr 22, 2008
  38. Jeff KingApr 22, 2008
  39. Junio C HamanoApr 22, 2008
  40. Jeff KingApr 22, 2008
  41. Teemu LikonenApr 23, 2008
  42. Junio C HamanoApr 23, 2008
  43. Andreas EricssonApr 23, 2008
  44. Jeff KingApr 23, 2008
  45. Jeff KingApr 23, 2008
  46. Teemu LikonenApr 23, 2008
  47. Junio C HamanoApr 9, 2008
  48. Teemu LikonenApr 10, 2008
  49. Santiago GalaApr 12, 2008
  50. Daniel BarkalowApr 9, 2008
  51. Ingo MolnarApr 9, 2008
  52. Daniel BarkalowApr 10, 2008
  53. Junio C HamanoApr 9, 2008
  54. Jon LoeligerApr 9, 2008
  55. Nicolas PitreApr 9, 2008
  56. Jeff KingApr 9, 2008
  57. André Goddard RosaApr 9, 2008
  58. Govind SalinasApr 10, 2008
  59. Jean-Christian de RivazApr 10, 2008
  60. Sverre RabbelierApr 10, 2008
  61. git-bisect annoyancesIngo Molnar, Apr 10, 2008
  62. Christian CouderApr 11, 2008
  63. Ingo MolnarApr 11, 2008
  64. Christian CouderApr 12, 2008
  65. Junio C HamanoApr 11, 2008
  66. When a remote is added but not fetched, tell the user.Gabriel, Apr 10, 2008
  67. Johannes SchindelinApr 11, 2008
  68. GabrielApr 11, 2008
  69. Default to fetching a remote after adding it.Gabriel, Apr 11, 2008
  70. Stephen SinclairApr 11, 2008
  71. Johannes SchindelinApr 12, 2008
  72. GabrielApr 12, 2008
  73. Johannes SchindelinApr 12, 2008
  74. Teemu LikonenApr 11, 2008
  75. Junio C HamanoApr 11, 2008
  76. Sverre RabbelierApr 11, 2008
  77. Junio C HamanoApr 11, 2008
  78. Sverre RabbelierApr 11, 2008
  79. Miles BaderApr 15, 2008
  80. Default to fetching a remote after adding it.Gabriel, Apr 11, 2008
  81. Wincent ColaiutaApr 11, 2008
  82. GabrielApr 11, 2008
  83. Luciano RochaApr 11, 2008
  84. Wincent ColaiutaApr 11, 2008
  85. Jeff KingApr 10, 2008
  86. Sverre RabbelierApr 10, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.