6 repos · 33 commands · 0 broken · 8 slow · 4 filed
Monorepo persona on win-x64: built main 22ec3d0 and ran a 120k-file daily loop (add/commit/status/diff/stash/switch/sparse), git/git and cargo at depth, 100k refs, 2x1 GiB binaries, untracked/ignored-heavy trees and Windows-specific cases (locked file, case collisions, CRLF, unicode names). Speed and memory are mostly at or better than git; all 6 fixes re-verified as fixed. Found 4 new bugs: a git-visible UNTR interop warning, add reporting mtime-only changes as staged, 6-10x slowness of clean/status --ignored walks, and a 13-25x cold loose-object read gap (gc/fsck) on Windows.
| repo | files | commits | .git | notes |
|---|---|---|---|---|
| git/git (local clone) | 4,857 | 82,605 | 323 MB | |
| git/git + 100k loose refs | 4,857 | 82,605 | 349 MB | 50k branches + 51k tags |
| rust-lang/cargo | 3,078 | 23,588 | 82 MB | |
| scratch/mono-120k | 120,000 | 7 | 51 MB | generated pkg/mod/f tree, autocrlf=true, plus 60k untracked + 60k ignored files in later tests |
| scratch/bin-2x1GiB | 202 | 2 | 2,049 MB | |
| scratch/lg-30k-loose | 30,000 | 1 | 10 MB | 31.5k loose objects, used for gc/fsck cold-read tests |
| command | repo | grit | git | grit/git | result | notes |
|---|---|---|---|---|---|---|
| grit clone <local git/git> | git/git | 1.87 s | 1.66 s | 1.1× | ok | |
| grit status (clean) | git/git | 256 ms | 355 ms | 0.7× | ok | |
| grit log -- builtin/log.c | git/git | 582 ms | 610 ms | 1.0× | ok | |
| grit blame diff.c | git/git | 1.63 s | 1.18 s | 1.4× | ok | |
| grit revs --count HEAD | git/git | 730 ms | 743 ms | 1.0× | ok | 1.75x git RSS |
| grit merge-base v2.0.0 v2.40.0 | git/git | 82 ms | 451 ms | 0.2× | ok | |
| grit log --since=2024-01-01 | git/git | 332 ms | 154 ms | 2.2× | ok | |
| grit gc (already packed) | git/git | 1.35 s | 9.30 s | 0.1× | ok | |
| grit repack -f | git/git | 33.82 s | 36.50 s | 0.9× | ok | pack 154.3 vs 149.8 MiB; git fsck --strict clean except upstream badFilemode |
| grit clone https://github.com/rust-lang/cargo | rust-lang/cargo | 27.43 s | 43.24 s | 0.6× | ok | git RSS is wrapper process only |
| grit fetch (200 behind) | rust-lang/cargo | 631 ms | 837 ms | 0.8× | ok | |
| grit add (120k new files) | scratch/mono-120k | 213.70 s | 367.50 s | 0.6× | ok | |
| grit commit (120k staged) | scratch/mono-120k | 8.60 s | 65.24 s | 0.1× | ok | |
| grit status (clean) | scratch/mono-120k | 310 ms | 169 ms | 1.8× | ok | |
| grit status (5000 touched) | scratch/mono-120k | 999 ms | 468 ms | 2.1× | ok | |
| grit diff --stat (5000 touched) | scratch/mono-120k | 832 ms | 871 ms | 1.0× | ok | |
| grit add (5000 touched) | scratch/mono-120k | 3.63 s | 9.37 s | 0.4× | ok | reports mtime-only files as staged: #2241 |
| grit commit (5000 staged) | scratch/mono-120k | 9.63 s | 3.22 s | 3.0× | slow | 3.0x; commit of already staged files does ~2 ms/file of extra work (cf. #1884) |
| grit commit (1 file, auto-stage) | scratch/mono-120k | 627 ms | 181 ms | 3.5× | slow | 3.5x, known #1884 |
| grit switch base (18k files differ) | scratch/mono-120k | 5.33 s | 6.46 s | 0.8× | ok | |
| grit switch wide (first run after commit) | scratch/mono-120k | 70.83 s | 8.66 s | 8.2× | slow | one-off cold run; repeated at 6.2 s vs git 8.4 s; not reproducible |
| grit stash / stash pop (3000 edits) | scratch/mono-120k | 8.42 s | 4.99 s | 1.7× | ok | pop 765 ms vs 1916 ms, 48 MB vs 89 MB |
| grit reset --hard (cone sparse, 300 visible) | scratch/mono-120k | 235 ms | 180 ms | 1.3× | ok | |
| grit status --ignored (60k untracked + 60k ignored) | scratch/mono-120k | 2.78 s | 468 ms | 5.9× | slow | 5.9x, filed #2242 |
| grit clean --dry-run (60k untracked + 60k ignored) | scratch/mono-120k | 6.05 s | 597 ms | 10× | slow | 10x, 5.1 s kernel time, filed #2242 |
| grit rebase --onto (1 commit, 18k files) | scratch/mono-120k | 9.01 s | 16.86 s | 0.5× | ok | resulting tree identical to git's; first run on fresh clone 15.5 s vs 21.2 s |
| grit add / commit / status / switch / diff --stat / gc (2 x 1 GiB blob) | scratch/bin-2x1GiB | 20.24 s | 27.36 s | 0.7× | ok | add 1 GiB; status modified 847 vs 2316 ms; diff --stat 2.1 GB vs 2.6 GB RSS; gc 11.8 vs 11.6 s, RSS 2.1 GB equal to git's pack-objects |
| grit branch (50k branches, 100k refs) | git/git + 100k loose refs | 1.64 s | 4.31 s | 0.4× | ok | full listing 1.8 s with ReadToEnd; my first harness reading line-by-line events inflated it to 210 s, harness artifact |
| grit clone <local, 100k refs> | git/git + 100k loose refs | 13.10 s | 92.90 s | 0.1× | ok | |
| grit status (100k refs) | git/git + 100k loose refs | 263 ms | 30 ms | 8.8× | slow | 8.8x but sub-300 ms absolute; same as the no-refs repo (256 ms), git hit its fast path |
| grit gc pack-refs + reflog expire (100k refs) | git/git + 100k loose refs | 18.89 s | 59.21 s | 0.3× | ok | first 20k-ref gc outlier (86 s) did not reproduce on retry (7 s) |
| grit gc (31.5k fresh loose objects) | scratch/lg-30k-loose | 142.83 s | 10.59 s | 13× | slow | 13x, filed #2243; same in reverse order |
| grit fsck (31.5k fresh loose objects, cold) | scratch/lg-30k-loose | 39.16 s | 1.38 s | 28× | slow | 28x cold; warm re-run 2.5 s; filed #2243 |