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

Re: [RFC/PATCH] remote: add new sync command

From
Jeff King <peff@peff.net>
Date
Nov 11, 2011, 18:13 UTC
Message-ID
<20111111181352.GA16055@sigill.intra.peff.net>
In-Reply-To
<CAMP44s2RjcFtdO2jft0Hg9RtqK-DRK47gX8By-dBFSBcSA+yFA@mail.gmail.com>
On Fri, Nov 11, 2011 at 02:30:48PM +0200, Felipe Contreras wrote:
Show 5 quoted lines
> > Doesn't --all mean all refs, including tags and branches?
> 
> Nope, only branches, try it. I also found it strange. And what is
> more, you can't use --all and --tags at the same time. Totally
> strange.
Yeah, you're right. Sorry for my confusion.

So in that sense, it is poorly named, and "--branches" (or "--heads") would be more accurate. At the same time, it is probably more likely what the user wants to do (you almost never want to push "refs/remotes", for example). So I am a little hesitant to suggest changing it, even with a warning and deprecation period.

> And yes, in this particular use-case that's what I am trying to avoid,
> but in other use-cases (like creating a new repo and pushing
> *everything*), a *true* --all would be nice.

Right. It looks like that is just spelled "--mirror" (which gives you pruning also), or "refs/*:refs/*" (without pruning). The latter is even more flexible, as you could do "refs/*:refs/foo/*" to keep several related backups in one upstream repo.

Just to get back to the original patch for a second: are we in agreement that what you want to do with "sync" is almost possible now (modulo a separate --prune option), and that there is a separate issue of making friendlier syntax for a few common refspecs?

Show 14 quoted lines
> > We could add syntactic sugar to make
> > --branches mean "refs/heads/*". But I do worry that pseudo-options like
> > that just end up creating more confusion (I seem to recall there being a
> > lot of confusion about "--tags", which is more or less the same thing).
> 
> But it's not, that could explain part of the confusion. I think these
> would be totally intuitive.
> 
>  --branches
>  --tags
>  --other
>  --all
>  --update
>  --prune

My problem with them syntactically is that you have option-looking things that are really not flags, but rather syntactic placeholders for refspecs. So you have:

  git push --prune remote --branches

which looks wrong from the perspective of usual option-parsing rules. And does:

  git push remote --prune --branches
work? Or:
  git push --prune --branches remote
?

I think we could make them all work if we want. But somehow the syntaxes just look wrong to me. Using a non-dashed placeholder for special refspecs makes more sense to me like:

  git push --prune remote BRANCHES

and then it really is just a special way of spelling "refs/heads/*". But then, I also think it's good for users to understand that the options are refspecs, and what that means. It's not a hard concept, and then when they inevitably say "how can I do BRANCHES, except put the result somewhere else in the remote namespace", it's a very natural extension to learn about the right-hand side o the refspec.

Of course I also think BRANCHES looks ugly, and people should just learn "refs/heads/*".

I dunno. Maybe my brain is fried from knowing too much about how git works. I don't have much of an "ordinary user" perspective anymore.

> But what about 'git fetch'? You didn't comment anything. I think we
> should try to be consistent in these imaginary future options, maybe
> to devise a transition, or at least to identify good names for the new
> options.

Yeah, fetch makes it harder because the options may have subtly different meanings. Using non-option placeholders would work around that. You would still have options for pruning, which to me is not really a refspec, but an option that acts on the refspecs.

>From the list in your previous email, you wrote:
> --prune -> rename to --prune-tracking?
> --prune-local (new; prune local branches that don't exist on the remote)

I think --prune wouldn't need renaming. If you fetch into tracking branches, then pruning would prune tracking branches. If you fetch as a mirror (refs/*:refs/*), then you would prune everything.

And "--prune-local" doesn't seem like a fetch operation to me. Either you are mirroring, and --prune already handles it as above. Or you are interested in getting rid of branches whose upstream has gone away. But that's not a fetch operation; that's a branch operation.

-Peff
Previous: Felipe ContrerasNext: Felipe Contreras
Message 19 of 26 in “remote: add new sync command”
  1. remote: add new sync commandFelipe Contreras, Nov 7, 2011
  2. Jeff KingNov 7, 2011
  3. Felipe ContrerasNov 7, 2011
  4. Jeff KingNov 7, 2011
  5. Felipe ContrerasNov 7, 2011
  6. Jeff KingNov 7, 2011
  7. Junio C HamanoNov 7, 2011
  8. Jeff KingNov 7, 2011
  9. Felipe ContrerasNov 8, 2011
  10. Junio C HamanoNov 8, 2011
  11. Felipe ContrerasNov 8, 2011
  12. Junio C HamanoNov 9, 2011
  13. Jakub NarebskiNov 11, 2011
  14. Junio C HamanoNov 11, 2011
  15. Jakub NarebskiNov 11, 2011
  16. Felipe ContrerasNov 8, 2011
  17. Jeff KingNov 8, 2011
  18. Felipe ContrerasNov 11, 2011
  19. Jeff KingNov 11, 2011
  20. Felipe ContrerasNov 12, 2011
  21. Jeff KingNov 14, 2011
  22. Felipe ContrerasNov 14, 2011
  23. Jeff KingNov 21, 2011
  24. Felipe ContrerasNov 21, 2011
  25. Jeff KingNov 30, 2011
  26. Felipe ContrerasNov 30, 2011

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.