7 repos · 34 commands · 4 broken · 0 slow · 3 filed
As a solo developer I re-checked all six fixed issues on current main (all fixed), then went deeper on interrupts (SIGINT/TERM/HUP/KILL across switch, reset, restore, commit, stash, merge, pick, gc, clone) on a 100k-file repo, a bare-remote push/pull/rebase loop, history rewrite/undo, interop with git-tuned repos, big-asset gc, and parity sweeps on git/git and cargo. Everyday speed and parity are very good (status/diff/log/blame/clone at or faster than git, log/diff/blame filters identical to git on git/git); I filed three bugs: stale index.lock after interrupting commit/stash/merge/pick, no log --follow, and commit --dry-run ignoring mode-only changes.
| repo | files | commits | .git | notes |
|---|---|---|---|---|
| octocat/Hello-World | 1 | 3 | 1 MB | |
| rust-lang/cargo | 3,078 | 23,596 | 81 MB | also used for fresh clones, shallow, --blobs none, git-tuned interop copy |
| git/git | 4,857 | 82,616 | 324 MB | |
| scratch/wide-100k-files | 100,000 | 1 | 27 MB | 500 dirs x 200 files; branches A (20k files edited) and B (20k other files edited) |
| scratch/deep-30k-commits | 50 | 30,000 | 9 MB | |
| scratch/churn-100mb-asset | 1 | 13 | 102 MB | |
| scratch/solo | 9 | 12 | 2 MB | daily-loop project with bare remote and two peer clones |
| command | repo | grit | git | grit/git | result | notes |
|---|---|---|---|---|---|---|
| grit status (clean) | rust-lang/cargo | 13 ms | 11 ms | 1.2× | ok | hyperfine |
| grit diff / log -n 20 | rust-lang/cargo | 4.8 ms | 2.7 ms | 1.8× | ok | log -n 20: 2.3 vs 1.4 ms |
| grit clone https://github.com/rust-lang/cargo | rust-lang/cargo | 3.46 s | 5.02 s | 0.7× | ok | fsck --strict clean |
| grit clone --depth 1 / fetch --depth 50 / --unshallow / --blobs none | rust-lang/cargo | — | — | — | ok | depth 50 -> 722 commits, same as git; unshallow -> 23596 |
| grit status (after touching all files) | scratch/wide-100k-files | 55 ms | 2.07 s | 0.0× | ok | |
| grit status (dirty, 2 changes) | scratch/wide-100k-files | 39 ms | 65 ms | 0.6× | ok | |
| grit diff (dirty) | scratch/wide-100k-files | 27 ms | 23 ms | 1.2× | ok | |
| grit add (2 changes) | scratch/wide-100k-files | 107 ms | 101 ms | 1.1× | ok | |
| grit commit -m x (2 changes, auto-stage) | scratch/wide-100k-files | 171 ms | 66 ms | 2.6× | ok | 2.6x, known #1884 |
| grit commit -m one -- <1 path> | scratch/wide-100k-files | 155 ms | 66 ms | 2.3× | ok | 2.3x, known #1884 |
| grit switch A / switch main (20k-file checkout) | scratch/wide-100k-files | 976 ms | 1.19 s | 0.8× | ok | RSS 1.9x git |
| grit merge B into A (clean, 20k files) | scratch/wide-100k-files | 4.0 ms | 8.0 ms | 0.5× | ok | merge was already done in this state; measured fast path only |
| grit stash (100 dirty files) | scratch/wide-100k-files | 130 ms | — | — | ok | |
| grit add node_modules (90k untracked files) | scratch/solo | 996 ms | 597 ms | 1.7× | ok | 1.7x slower, 2.3x RSS |
| grit commit -m nm (90k new files) | scratch/solo | 1.16 s | — | — | ok | |
| grit blame builtin/commit.c | git/git | 621 ms | 550 ms | 1.1× | ok | line attribution identical to git blame --porcelain on 5 files |
| grit log -n 50 -- builtin/commit.c | git/git | 38 ms | 45 ms | 0.8× | ok | |
| grit log -- Documentation/git-commit.txt (full) | git/git | 480 ms | 464 ms | 1.0× | ok | |
| grit log filters (13 combos) | git/git | — | — | — | ok | oid lists identical to git |
| grit diff --patch-text v2.10.0 v2.43.0 | git/git | 1.29 s | 950 ms | 1.4× | ok | hunk-header function labels differ in a few hunks |
| grit diff --patch-text v2.40.0 v2.41.0 | git/git | 109 ms | — | — | wrong | byte-identical except 7 hunk headers ('out:' vs signature); not filed (cosmetic) |
| grit log --follow -- builtin/commit.c | git/git | — | — | — | error | option does not exist; filed #2316 |
| grit log (30k linear commits) | scratch/deep-30k-commits | 140 ms | 108 ms | 1.3× | ok | |
| grit log -- f7.txt (30k linear commits) | scratch/deep-30k-commits | 257 ms | 216 ms | 1.2× | ok | |
| grit merge-base HEAD HEAD~20000 | scratch/deep-30k-commits | 103 ms | 58 ms | 1.8× | ok | |
| grit diff/show/status on 600 MB binary | scratch/big-asset | 3.0 ms | 1.0 ms | 3.0× | ok | |
| grit gc (100 MB asset, 12 edits) | scratch/churn-100mb-asset | 23.07 s | 18.09 s | 1.3× | ok | pack 102 MB vs 101 MB, fsck clean |
| grit gc while committing 30 times | rust-lang/cargo | 2.09 s | — | — | ok | |
| grit stash / commit / merge / pick killed by SIGINT, SIGTERM, SIGHUP | scratch/wide-100k-files | — | — | — | wrong | index.lock + index~pid.lock left behind; filed #2315 |
| grit switch / reset --hard / restore killed by SIGINT, TERM, HUP | scratch/wide-100k-files | — | — | — | ok | rolled back, 'operation cancelled', no locks |
| grit commit --dry-run (mode-only change) | scratch/solo | — | — | — | wrong | says nothing to commit; filed #2318 |
| grit push/pull/pull --rebase/rebase --continue/push --delete/--force-with-lease | scratch/solo | — | — | — | ok | bare remote fsck --strict clean; rejected push exit 1 with JSON |
| grit history reword/drop/fixup/undo | scratch/hist | — | — | — | ok | change-ids preserved |
| grit bundle create/verify/list, notes add, tag | scratch/solo | — | — | — | ok | git bundle verify and git clone of grit bundle work |