grit://cooking/dogfood← what’s cooking
Thursday, October 29, 2026 · Ubuntu 24.04.5 LTS (kernel 6.12.94+)

Dogfood on linux-cloud: Individual developer

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.

os
Ubuntu 24.04.5 LTS (kernel 6.12.94+) · x86_64
machine
Cursor cloud VM, 4 vCPU Intel Xeon, 15 GB RAM
versions
grit 0.5.24 · main 1d054b51 · 2.43.0
repositories7
repofilescommits.gitnotes
octocat/Hello-World131 MB
rust-lang/cargo3,07823,59681 MBalso used for fresh clones, shallow, --blobs none, git-tuned interop copy
git/git4,85782,616324 MB
scratch/wide-100k-files100,000127 MB500 dirs x 200 files; branches A (20k files edited) and B (20k other files edited)
scratch/deep-30k-commits5030,0009 MB
scratch/churn-100mb-asset113102 MB
scratch/solo9122 MBdaily-loop project with bare remote and two peer clones
commandsgrit vs. system git, wall time
commandrepogritgitgrit/gitresultnotes
grit status (clean)rust-lang/cargo13 ms11 ms1.2×okhyperfine
grit diff / log -n 20rust-lang/cargo4.8 ms2.7 ms1.8×oklog -n 20: 2.3 vs 1.4 ms
grit clone https://github.com/rust-lang/cargorust-lang/cargo3.46 s5.02 s0.7×okfsck --strict clean
grit clone --depth 1 / fetch --depth 50 / --unshallow / --blobs nonerust-lang/cargo———okdepth 50 -> 722 commits, same as git; unshallow -> 23596
grit status (after touching all files)scratch/wide-100k-files55 ms2.07 s0.0×ok
grit status (dirty, 2 changes)scratch/wide-100k-files39 ms65 ms0.6×ok
grit diff (dirty)scratch/wide-100k-files27 ms23 ms1.2×ok
grit add (2 changes)scratch/wide-100k-files107 ms101 ms1.1×ok
grit commit -m x (2 changes, auto-stage)scratch/wide-100k-files171 ms66 ms2.6×ok2.6x, known #1884
grit commit -m one -- <1 path>scratch/wide-100k-files155 ms66 ms2.3×ok2.3x, known #1884
grit switch A / switch main (20k-file checkout)scratch/wide-100k-files976 ms1.19 s0.8×okRSS 1.9x git
grit merge B into A (clean, 20k files)scratch/wide-100k-files4.0 ms8.0 ms0.5×okmerge was already done in this state; measured fast path only
grit stash (100 dirty files)scratch/wide-100k-files130 ms——ok
grit add node_modules (90k untracked files)scratch/solo996 ms597 ms1.7×ok1.7x slower, 2.3x RSS
grit commit -m nm (90k new files)scratch/solo1.16 s——ok
grit blame builtin/commit.cgit/git621 ms550 ms1.1×okline attribution identical to git blame --porcelain on 5 files
grit log -n 50 -- builtin/commit.cgit/git38 ms45 ms0.8×ok
grit log -- Documentation/git-commit.txt (full)git/git480 ms464 ms1.0×ok
grit log filters (13 combos)git/git———okoid lists identical to git
grit diff --patch-text v2.10.0 v2.43.0git/git1.29 s950 ms1.4×okhunk-header function labels differ in a few hunks
grit diff --patch-text v2.40.0 v2.41.0git/git109 ms——wrongbyte-identical except 7 hunk headers ('out:' vs signature); not filed (cosmetic)
grit log --follow -- builtin/commit.cgit/git———erroroption does not exist; filed #2316
grit log (30k linear commits)scratch/deep-30k-commits140 ms108 ms1.3×ok
grit log -- f7.txt (30k linear commits)scratch/deep-30k-commits257 ms216 ms1.2×ok
grit merge-base HEAD HEAD~20000scratch/deep-30k-commits103 ms58 ms1.8×ok
grit diff/show/status on 600 MB binaryscratch/big-asset3.0 ms1.0 ms3.0×ok
grit gc (100 MB asset, 12 edits)scratch/churn-100mb-asset23.07 s18.09 s1.3×okpack 102 MB vs 101 MB, fsck clean
grit gc while committing 30 timesrust-lang/cargo2.09 s——ok
grit stash / commit / merge / pick killed by SIGINT, SIGTERM, SIGHUPscratch/wide-100k-files———wrongindex.lock + index~pid.lock left behind; filed #2315
grit switch / reset --hard / restore killed by SIGINT, TERM, HUPscratch/wide-100k-files———okrolled back, 'operation cancelled', no locks
grit commit --dry-run (mode-only change)scratch/solo———wrongsays nothing to commit; filed #2318
grit push/pull/pull --rebase/rebase --continue/push --delete/--force-with-leasescratch/solo———okbare remote fsck --strict clean; rejected push exit 1 with JSON
grit history reword/drop/fixup/undoscratch/hist———okchange-ids preserved
grit bundle create/verify/list, notes add, tagscratch/solo———okgit bundle verify and git clone of grit bundle work
worked9
  • ›Cancellation of switch/reset --hard/restore/clone via SIGINT/TERM/HUP is now clean with a clear message
  • ›Stale-lock error names the dead pid; hook failures leave the staged/unstaged split intact
  • ›Change-id header survives history reword/drop/fixup/undo and git fsck --strict accepts it
  • ›Log filters, blame and numstat match git exactly on git/git and cargo; --patch-text patches apply with git apply, including binaries
  • ›Status after touching 100k files is 55 ms (git 2.1 s on first run); big-asset (600 MB) diff/status now 3 ms / 15 MB
  • ›Interop: grit commits keep git's index v4, untracked cache, commit-graph and midx valid; linked worktrees and submodule bumps fine
  • ›Three concurrent pushers to a bare repo end consistent with clean fsck; pull --rebase conflicts now leave resumable state
  • ›Hostile trees (.git/, .GIT/ entries) are rejected at clone
  • ›--json outputs parse for every command tried; JSON errors carry kind and hint
problems12
  • ›Filed #2315: commit/stash/merge/pick interrupted by SIGINT/TERM/HUP leave index.lock (also release 0.5.24)
  • ›Filed #2316: grit log has no --follow; renamed-file history stops at the rename
  • ›Filed #2318: commit --dry-run omits mode-only changes and reports 'nothing to commit'
  • ›Not filed (cosmetic): rename display is 'a => b' with full paths vs git's brace form in --stat/--numstat
  • ›Not filed (cosmetic): --patch-text hunk header function labels can differ ('out:' label vs function signature) because diff drivers like cpp are not applied
  • ›Not filed (minor): diff --patch-text for a modified binary always emits full 'literal N' data (258 KB for 100 KB random file vs git --binary 264 B delta)
  • ›Not filed (minor): human 'grit add' prints non-UTF-8 paths as 'grit+pathhex:...' and newline names raw
  • ›Not filed (minor UX): grit pull 'local changes would be overwritten' error lists no files; rebase --continue with unstaged resolved file says 'unmerged paths remain in the index' without 'grit add' hint; 'grit push nowhere' reports 'src refspec nowhere does not match any ref' (no 'no such remote' hint, JSON error has no kind); 'grit blame nofile' prints a raw os error 2; 'grit cat HEAD:a' on a corrupt blob says unknown revision instead of corrupt object
  • ›Not filed (minor): after kill -9 mid-switch the leftover half-checkout is reported as 10k user edits and the hint says 'commit them' which would commit the partial checkout (same exposure as git)
  • ›Not filed: fsmonitor could not be exercised (git 2.43 fsmonitor--daemon unsupported on this VM)
  • ›Not filed: git 2.43 aborting with 'BUG: wt-status.c:579' after git update-index --split-index is a git-side problem
  • ›Single-file commit on a 100k-file tree is 2.3-2.6x git (already #1884); add of 90k new files 1.7x time and 2.3x RSS vs git (below the 3x bar)
bugs filed3
#2315 #2316 #2318already reported: #2142 #1884 #1859 #1883 #2303 #1014 #2155 #1909 #2154
next time
  • ›Real ssh push/fetch with two concurrent pushers (needs sshd) and thin packs, fsck after each
  • ›Case-insensitive filesystem checks for merge/switch/pick when a branch adds a file differing only by case (needs macOS/Windows)
  • ›Interrupt matrix for rebase --continue, fetch/pull/push mid-pack and gc on a 200k-file repo with core.lockfilePid, after #2315 is fixed (re-run commit/stash/merge/pick under SIGINT/TERM/HUP)
  • ›core.fsmonitor hook usage and timings (needs a git with fsmonitor--daemon or a watchman-style hook)
  • ›log --follow equivalent after #2316; also test log -L across renames and show --follow-style rename display
  • ›10k-commit churn with 100-200 MB binaries and gc.autoPackLimit consolidation; gc --auto never runs after grit commit (#1859)
  • ›Library variant: tiny solo tool over typed APIs (reflog after rebase, custom ObjectStore, commit/stash cancellation per #2142)