grit://cooking/dogfood← what’s cooking
Wednesday, October 28, 2026 · macOS 15.7 (Darwin 24.6.0), APFS case-insensitive

Dogfood on scott-mbp: Individual developer

6 repos · 30 commands · 5 broken · 0 slow · 4 filed

As a solo developer on macOS (APFS, case-insensitive) I re-checked all six fixed issues (five are fixed; #2236 stat/numstat is still off by one against grit's own patch and was reopened), then ran the daily loop, macOS filesystem cases, interrupts, a 100k-file tree, hooks/odd content and a small grit-lib program. Speed and memory are mostly at or better than git; I filed four new bugs (#2244, #2247, #2253, #2262), mostly state/integrity problems around commit, hooks, binary patches and case handling.

os
macOS 15.7 (Darwin 24.6.0), APFS case-insensitive · arm64
machine
scott-mbp (agador.sparticus), Apple M3, 24 GB RAM
versions
grit 0.5.0 (PATH); tested build is main · main 7071b202 · 2.52.0
repositories6
repofilescommits.gitnotes
rust-lang/cargo (git clone)3,07823,59181 MB
rust-lang/cargo (grit clone)3,07823,59190 MBfsck clean; same 218 refs
scratch/wide-100k100,000316 MB400 dirs x 250 small files
scratch/big-600mb11573 MBone 600 MB random blob
scratch/bin229 MBbinary patch repro
octocat/Hello-World131 MB
commandsgrit vs. system git, wall time
commandrepogritgitgrit/gitresultnotes
grit statusrust-lang/cargo (git clone)21 ms40 ms0.5×ok
grit diffrust-lang/cargo (git clone)8.1 ms7.5 ms1.1×ok
grit log -n 50 --onelinerust-lang/cargo (git clone)4.0 ms5.2 ms0.8×ok
grit log --oneline -- src/util/workspace.rsrust-lang/cargo (git clone)76 ms73 ms1.0×ok
grit blame src/util/workspace.rsrust-lang/cargo (git clone)45 ms64 ms0.7×ok
grit log -S CargoResult -n 100000 --jsonrust-lang/cargo (git clone)1.06 s1.93 s0.5×ok1154 commits, same as git; -G, --grep -i, date range and --first-parent counts also identical
grit diff --stat A B (3000..2900 back)rust-lang/cargo (git clone)———wrongcounts off by one on several files (#2236 not fixed)
grit reset --hard master (from master~3000)rust-lang/cargo (git clone)308 ms——okSIGINT/TERM: clean cancel
grit restore --source master~3000 -- .rust-lang/cargo (git clone)655 ms——okprints one 'Restored <path>' line per file (3000 lines)
grit stash / stash pop (2879 modified files)rust-lang/cargo (git clone)866 ms——okpop 271 ms; SIGINT ignored until done
grit gcrust-lang/cargo (git clone)230 ms1.08 s0.2×okalready-packed repo
grit clone https://github.com/rust-lang/cargorust-lang/cargo (grit clone)32.51 s107.97 s0.3×oknetwork bound; git run was earlier and slower, not a controlled comparison
grit status (first, after clone)rust-lang/cargo (grit clone)22 ms39 ms0.6×ok
grit commit -m big (100000 new files)scratch/wide-100k7.92 s28.01 s0.3×okgit add -A took 28 s (git commit extra 0.77 s)
grit statusscratch/wide-100k114 ms105 ms1.1×ok
grit diff --statscratch/wide-100k68 ms65 ms1.0×ok
grit add d010/f010.txtscratch/wide-100k71 ms39 ms1.8×ok1.8x; known #1682 family
grit commit -m x (1 modified file)scratch/wide-100k260 ms110 ms2.4×ok2.4x time, 2.0x memory; known #1884
grit clone <local 100k-file repo>scratch/wide-100k3.92 s——ok
grit diff / diff --stat / show / log -p after editing 100 bytes of a 600 MB blobscratch/big-600mb340 ms11.98 s0.0×ok#2237 fixed
grit diff --patch-text A B (modified binary)scratch/bin———wrong'literal 0' binary patch, git apply fails (#2244)
grit add blob.bin (600 MB)scratch/big-600mb9.81 s11.27 s0.9×ok
grit commit x6 + grit gc (100 MB asset, 1 KB edits)scratch/big-600mb6.99 s4.13 s1.7×okcommits 7 s vs git 13 s; .git 96 MB vs 97 MB after gc
grit commit (auto-stage) after dir case renamescratch/case———wrongrenames tracked paths (#2247)
grit commit with failing pre-commit hookscratch/hk———wrongindex left auto-staged (#2253)
grit commit after resolving a pick conflictscratch/pc———wrongauthor lost, CHERRY_PICK_HEAD left (#2262)
grit push / pull / pull --ff-only / push --force-with-leasescratch/solo———oklocal bare remote; exit codes 1 (rejected) and 128 (not ff); remote fsck clean
grit history reword/drop/undo/squash, rebase, pickscratch/rb———okfsck clean, change-id preserved
grit blame --json vs git blame --porcelain (60 files)rust-lang/cargo (git clone)———ok17 files with default and -w: 0 differences; -C -C differs from git on 66 of 115 files (heuristic, not filed)
commit_worktree with FlagCancel (library)scratch/wide-100k352 ms——okcancel at 100 ms honoured at 352 ms; cancel at 20 ms at 77 ms; at 900 ms at 901 ms
worked9
  • ›status, diff, log, blame, path-log and -S/-G/--grep/date filters on cargo match git and are as fast or faster
  • ›grit add/commit of 100k files is 3.5x faster than git; clone of 100k files in 3.9 s
  • ›Cancellation of reset --hard, restore, clone and library commit leaves no lock and an unchanged repository
  • ›Error messages name the problem and the next command (dirty switch, untracked overwrite, rejected push, ff-only, tag -a without message)
  • ›Safe defaults: clean is a dry run, reset warns when commits become unreachable, switch refuses to overwrite
  • ›change-id headers kept across rebase, history reword/drop/squash/undo; history undo restores refs exactly
  • ›NFC normalisation, symlinks, exec bit, odd file names and worktrees on APFS interoperate with git (fsck clean)
  • ›--json validated on 26 commands; --markdown correctly widens fences around embedded code fences
  • ›grit-lib quick start compiles from the docs; typed Error variants (NothingToCommit, Hook with output, Cancelled) are usable
problems11
  • ›#2244 diff/show --patch-text of a modified binary emits 'literal 0' (and an empty body for worktree/staged diffs); git apply rejects it (filed)
  • ›#2236 stat/numstat still off by one vs patch/git on commit-pair diffs (verify_fix: not fixed, reopened)
  • ›#2247 core.ignorecase auto-stage renames tracked dirs/files to the on-disk case, rewriting unrelated paths (filed)
  • ›#2253 failing pre-commit/commit-msg hook leaves auto-staged index and staged untracked files (filed; same at library level)
  • ›#2262 grit commit after a pick/revert conflict loses the picked author and leaves CHERRY_PICK_HEAD; --continue/--abort fail (filed)
  • ›grit blame -C -C differs from git on 66 of 115 cargo files, mostly blank/trivial lines attributed to other files (git ignores lines below its interesting-line threshold); not filed, low value and heuristic
  • ›grit restore prints one 'Restored <path>' line per file (3000 lines on cargo); not filed, cosmetic
  • ›grit log on an unborn branch prints the 'make one with grit commit' hint twice; grit init has no -q; numstat renames print 'old => new' instead of git's {a => b} form; not filed, cosmetic
  • ›stash ignores SIGINT until finished (~0.9 s on 2.9k files) and library commit cancel has a ~250 ms un-polled window; both covered by #2142
  • ›gc of 6x100 MB churn is 1.7x slower than git (7.0 s vs 4.1 s); within threshold, not filed
  • ›1-file commit in 100k-file repo is 2.4x time / 2x memory vs git; known #1884
bugs filed4
#2244 #2247 #2253 #2262already reported: #1884 #1682 #2142 #2183 #1014 #2155 #2201
next time
  • ›Case-insensitive checkout paths beyond identical leaves: merge/switch/pick when a branch adds a file differing only by case, and git-created repos with differing dir case
  • ›Test grit commit/pick/revert/merge finishing paths for authorship and state cleanup (pick -x, revert --mainline, merge --continue vs commit) and the stale-state recovery commands
  • ›Real ssh push/fetch with thin packs and two concurrent pushers (needs sshd) and fsck after each
  • ›Interrupt matrix for merge, pick, rebase --continue, gc and push on a repo with 100k+ files, including kill -9 and index.lock held by an editor
  • ›fsmonitor: core.fsmonitor hook usage and timings on a 200k-file tree
  • ›Library: Remote::fetch into a custom ObjectStore and a TUI-style loop over typed APIs; measure the un-polled cancel window in commit_worktree
  • ›Full blame -C parity sweep on git/git with a minimal repro for the blank-line attribution difference