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

[PATCH v2 0/2] fetch --prune performance problem

From
Phil Hord <phil.hord@gmail.com>
Date
Jun 23, 2025, 23:43 UTC
Message-ID
<20250623234327.335490-1-phil.hord@gmail.com>
From: Phil Hord <phil.hord@gmail.com>

`git fetch --prune` runs in O(N^2) time normally. This happens because the code iterates over each ref to be pruned to display its status. In a repo with 174,000 refs, where I was pruning 15,000 refs, the current code made 2.6 billion calls to strcmp and consumed 470 seconds of CPU. After this change, the same operation completes in under 1 second.

The loop looks like this:
    for p in prune_refs { for ref in all_refs { if p == ref { ... }}}

That loop runs only to check for and report newly dangling refs. A workaround to avoid this slowness is to run with `-q` to bypass this check.

There is similar check/report functionality in `git remote prune`, but it uses a more efficient method to check for dangling refs. prune_refs is first sorted, so it can be searched in O(logN), so this loop is O(N*logN).

    for ref in all_refs { if ref in prune_refs { ... }}

We can use that function instead, with some minor cleanup to the output to deal with the ordering being changed.

This patch version only adds the deleted branch name to the output of the dangling sym refs since the ordering has changed. This is only a minor cleanup and was not actually needed since, for example, `git origin prune` already did not mind losing track of this information in its output. But now it is improved to be more explicit.

Phil Hord (2):
  fetch-prune: optimize dangling-ref reporting
  refs: remove old refs_warn_dangling_symref
 builtin/fetch.c  | 20 ++++++++++----------
 builtin/remote.c |  4 ++--
 refs.c           | 21 ++++-----------------
 3 files changed, 16 insertions(+), 29 deletions(-)
-- 
2.50.0.84.g5d85fe910b.dirty
Next: Phil Hord
Message 1 of 4 in “fetch --prune performance problem”
  1. 0/2 fetch --prune performance problemPhil Hord, Jun 23, 2025
  2. 1/2 fetch-prune: optimize dangling-ref reportingPhil Hord, Jun 23, 2025
  3. Jeff KingJun 24, 2025
  4. 2/2 refs: remove old refs_warn_dangling_symrefPhil Hord, Jun 23, 2025

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.