Skip to content

Performance regression between microsoft Git 2.52 and Microsoft git 2.55 #970

Description

@arista-ms

I recently upgraded from 2.52 to 2.55, and 2.55 is so slow I had to disable my __git_ps1 function.
This is a MS internal large monorepo where I use scalar to clone only parts of it.

I had copilot try to figure out why, it installed the old and new versions, and this is what it concluded:

Diagnosis complete.

The slowdown is a Microsoft Git 2.55 regression exposed by two unusual characteristics of this repository:

  •  __git_ps1  trigger: it runs  git rev-parse --short HEAD . This repo’s 39 GB Scalar/VFS shared cache contains 37,815  .pack  + 37,815  .idx  files and 21.2 million indexed objects. Microsoft Git 2.52 takes ~0.4 s to abbreviate  HEAD ; 2.55 takes ~4.5 s. In 2.55, the lookup references the shared cache about 75,627 times, versus 37,808 in 2.52.  git rev-parse HEAD  without abbreviation remains instantaneous, and  --short=40  is also instantaneous.
  • Status/diff trigger: the sparse index has 56,919 physical entries, including 429 sparse directories representing about 402,915 logical paths. Both versions perform the same 12 tree traversals to depth
  1. That traversal takes 0.08 s in Microsoft Git 2.52 but 4.74 s in 2.55. Filesystem refresh, untracked scanning, hooks, index reading, hashing, staged changes, and rename detection are not the bottleneck.

The package log confirms Microsoft Git was upgraded from 2.52.0.vfs.0.5 to 2.55.0.vfs.0.3 on July 27, matching the reported onset. A read-only A/B test used the official Microsoft 2.52 release extracted into session storage—not Ubuntu Git—and showed  status / diff  at roughly 0.45–0.54 s under 2.52 versus 4–5 s under 2.55 on the same repository and index.

The repository exposes regressions in Microsoft Git 2.55’s object-ID abbreviation over a highly fragmented VFS cache and tree comparison over a large sparse index.

While, yes, my repository may need some fixing (or to throw it away and create a new one), the big performance regression is worth investigating.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions