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

Re: [PATCH/RFC 0/3] teach fetch --prune

From
Junio C Hamano <gitster@pobox.com>
Date
Nov 6, 2009, 07:05 UTC
Message-ID
<7vhbt83zgo.fsf@alter.siamese.dyndns.org>
In-Reply-To
<1257484241-27219-1-git-send-email-jaysoffian@gmail.com>
Jay Soffian <jaysoffian@gmail.com> writes:
Show 14 quoted lines
> This is just a start so I can get some feedback. Some things still missing:
>
> 1) "git remote prune <remote>" calls warn_dangling_symref(), but 
> "git fetch --prune" does not. I ran out of time tonight to refactor 
> warn_dangling_symref() to do something more intelligent than just spew to
> stdout (which doesn't get along with fetch, which spews to stderr...).
>
> 2) Perhaps "git remote update --prune" should be refactored to call 
> "git fetch --prune". If so, then fetch should gain a "--prune-only" option
> so that "git remote prune" can just call "got fetch --prune-only".
>
> 3) Perhaps add a config option for users who wish to prune by default.
>
> Thoughts, comments, flames?

I usually refrain from talking about multi-year long term plans, because I do not have one, but in a longer term (across 1.7.0 boundary and beyond), the general direction would be:

 - "fetch" will eventually prune by default; I expect we will have a
   configuration option "fetch.autoprune = yes" to allow early adopters to
   let it prune until 1.7.0, and in 1.7.0 we will change the default for
   the configuration variable to "yes", i.e. we prune unless the user
   explicitly declines with "fetch.autoprune = no".
 - In general, "remote" should go back to its roots of being the
   management interface to [remote "nick"] configuration section.  We
   should start planning to remove extra features that were piled on top
   of the original "remote definition management tool".  "update/prune"
   should have been the duty of "fetch" in the first place, but they were
   added to "remote" primarily because it was easier to do so ("remote"
   used to be script but "fetch" was already written in "C").
   This means two things:
   * "remote prune" that only prunes without updating remaining tracking
     will be largely become unnecessary [*1*], once we have a way to tell
     "fetch" to prune at the same time.  As soon as "fetch --prune"
     becomes available, "remote prune" should become an alias to it.  And
     "remote prune" itself should eventually be removed.
   * "remote update" that runs "fetch" for multiple remotes should be
     deprecated and eventually removed.  "remote update" is a band-aid
     that exists only because "fetch" started as a strange chimera between
     plumbing and Porcelain, and we did not want to add too much features
     to it.  "fetch" itself should learn to do the "from multiple places"
     part as a full-fledged Porcelain.

Of course, a removal of a subcommand ("remote update" and "remote prune") will have to happen way after 1.7.0 boundary, but the above should be the longer term direction.

Don't worry about keeping the "only prune without updating" misfeature. If omission of it simplifies what you are trying to do, it is Ok if "git prune" becomes a synonym to "git update --prune" aka "git fetch --prune" and starts updating the tracking refs.

[Footnote]

*1* "remote prune" is a band-aid that exists only because "fetch" currently has no-way to prune at the same time.

One could argue that a user may want to prune _only_ stale refs without getting the state of remaining refs updated to his tracking refs. That certainly is _possible_ with "remote prune", but being possible and being sensible are two different things.

What is the reason the user does not want to update a tracking ref that corresponds to a branch that remains at the remote, when he runs "prune only" version if it existed? It cannot be because the branch may have been rewound and you may lose the only remaining history---the user is actively asking to prune and is willing to lose the history of stale branches.

In other words, once we have "fetch --prune" (either default or optional---the important part is that there is a way to cause fetch to do this), there is no sane reason to have a separate command that only prunes without updating the remaining tracking refs.

Previous: Jay Soffian
Message 5 of 5 in “teach fetch --prune”
  1. 0/3 teach fetch --pruneJay Soffian, Nov 6, 2009
  2. 1/3 remote: refactor some logic into get_stale_heads()Jay Soffian, Nov 6, 2009
  3. 2/3 builtin-fetch: add --dry-run optionJay Soffian, Nov 6, 2009
  4. 3/3 builtin-fetch: add --prune optionJay Soffian, Nov 6, 2009
  5. Junio C HamanoNov 6, 2009

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.