grit://cooking/dogfood← what’s cooking
Wednesday, October 28, 2026 · macOS 15.7 (24G214)

Dogfood on scott-mbp: Git power user switching over

5 repos · 29 commands · 4 broken · 5 slow · 5 filed

Git power user on macOS 15 / M3: alternated git and grit on git-built repos with MIDX+bitmaps, split index, commit-graph (changed paths), sparse-checkout cone + sparse index, linked worktrees, submodules, reftable, hooks, config includes, CRLF/filters/ident/UTF-16, and ran git gc --auto / git commit concurrently with grit commit/gc. On-disk interop is very solid (git fsck --strict clean everywhere, byte-identical trees for attribute/filter/symlink/odd-name cases, all 6 fixed issues verified). The problems are in behavior a git user relies on: a hasconfig includeIf identity bug, stale gitlinks in the index after switch/merge, missing merge/commit hooks, no ORIG_HEAD, and log -S/-G rename false positives. 5 issues filed.

os
macOS 15.7 (24G214) · arm64
machine
scott-mbp (agador.sparticus): Apple M3, 8 cores, 24 GB RAM
versions
grit 0.5.0 (installed on PATH; not used for measurements) · main eb2680ab · 2.52.0 (Apple/Homebrew)
repositories5
repofilescommits.gitnotes
rust-lang/cargo3,07823,58887 MBalso used for local clones, partial clone, gc/reflog tests
git/git4,85782,605340 MBcommit-graph with changed paths written by git
scratch/adv (git-built: midx+bitmap, split index, commit-graph, submodule, worktree, hooks)4351,5093 MB
octocat/Hello-World131 MBcloned, not otherwise used
scratch/* (attrs, fs, case, sparse, reftable, hooks, pickaxe, in-progress-ops)———small synthetic repos created with git and grit
commandsgrit vs. system git, wall time
commandrepogritgitgrit/gitresultnotes
grit statusrust-lang/cargo20 ms20 ms1.0×okwith Git-written midx; 14.8 MB without
grit statusgit/git10 ms130 ms0.1×okgit first run was cold
grit log -n 20000rust-lang/cargo150 ms100 ms1.5×memory2.9x git's peak RSS
grit log -n 10000git/git70 ms60 ms1.2×ok
grit log -- src/cargo/core/resolverrust-lang/cargo110 ms90 ms1.2×ok
grit log -n 200 -- cache.hgit/git20 ms19 ms1.1×ok
grit revs --count HEADgit/git20 ms10 ms2.0×ok
grit blame builtin/commit.cgit/git230 ms140 ms1.6×ok
grit blame Cargo.tomlrust-lang/cargo60 ms——ok65 MB peak
grit log -S the_repository -- builtin/git/git3.98 s948 ms4.2×slow4.2x; also returns 2 extra commits (renames), filed #2203
grit log -S sha1_file -n 20 -- cache.hgit/git490 ms133 ms3.7×slow3.7x, #2203
grit log -S sha1_file -n 50git/git8.03 s4.97 s1.6×ok1.6x
grit log -G '^static int cmd_' -n 30 -- builtin/commit.cgit/git280 ms100 ms2.8×ok2.8x, just under threshold
grit fsckrust-lang/cargo910 ms4.19 s0.2×okdetects flipped pack byte (badPackChecksum, corruptObject) like git
grit fsck --connectivity-onlyrust-lang/cargo7.50 s540 ms14×slow14x slower than git and 8x slower than grit's own full fsck; 'Checked 0 objects'. Not filed (rarely used flag)
grit fsckgit/git9.49 s26.72 s0.4×okonly the legacy missingTaggerEntry issue, same as git
grit fsck --connectivity-onlygit/git133.90 s2.58 s52×slow52x slower than git; unfiled (see above)
grit gc (4-month-old reflog entries)rust-lang/cargo2.27 s1.07 s2.1×okverified #2192
grit reflog expire --allrust-lang/cargo10 ms——ok
grit add (all files touched)rust-lang/cargo80 ms90 ms0.9×okverified #2190, 0 loose objects
grit gc / grit repack (offline partial clone)rust-lang/cargo890 ms530 ms1.7×okverified #2065
grit commit / switch / merge / stash / gc interleaved with gitscratch/adv———okfsck --strict clean; hooks ran; split index kept
grit merge (ff or real) with checked-out submodule aheadscratch/adv———wrong#2200 stale gitlink in index
grit merge with pre-merge-commit/commit-msg hooksscratch/adv———wrong#2201
grit config user.email (hasconfig includeIf)scratch/adv———wrong#2199
grit reset --hard / merge / rebase then ORIG_HEADscratch/adv———wrong#2202
grit worktree add/switch/reset (reftable)scratch/adv———okverified #2062
grit commit/switch/merge/reset in cone sparse index reposcratch/adv———ok
grit clone (case-colliding tree)scratch/adv32 ms——okcollision warning, same state as git
worked7
  • ›git fsck --strict clean after every grit write in every scenario (loose, packed, midx, split index, sparse index, reftable, partial clone)
  • ›grit commit/add produce byte-identical trees to git add -A + commit for CRLF/eol/filter/ident/UTF-16/symlink/exec-bit/odd-name/NFD cases
  • ›grit gc removes stale midx/bitmaps, rewrites commit-graph with changed-path bloom data, git verify passes
  • ›Hooks pre-commit/commit-msg/post-commit/post-checkout/post-merge/post-rewrite run; config includes (path, gitdir, gitdir/i, onbranch) and global excludesFile resolved correctly
  • ›Cross-tool merge and conflict resolution state (MERGE_HEAD etc.) works both directions; reflog/rev syntax matches git; corruption is detected by grit fsck
  • ›Concurrent git gc --auto / grit gc / git commit / grit commit on one repo: no corruption, clean lock failures
  • ›Cone sparse-checkout and sparse index preserved by grit commit/switch/merge/reset
problems11
  • ›FILED #2199: includeIf hasconfig:remote.*.url: ignored for repo-local remotes, grit commits with the wrong identity
  • ›FILED #2200: switch / merge --ff leave stale gitlink in index when the submodule checkout is ahead (staged revert of bump)
  • ›FILED #2201: merge skips pre-merge-commit/prepare-commit-msg/commit-msg; commit skips prepare-commit-msg; rebase skips pre-rebase
  • ›FILED #2202: reset/merge/rebase never write ORIG_HEAD
  • ›FILED #2203: log -S/-G list pure renames; log -S/-G with a pathspec 3-4x slower than git on git/git
  • ›Unfiled: grit fsck --connectivity-only is 14x (cargo) to 52x (git/git, 134 s) slower than git and slower than grit's own full fsck, prints 'Checked 0 objects' (rarely used flag; should be a quick fix to share the full-fsck walk)
  • ›Unfiled: grit status ignores diff.ignoreSubmodules / status.ignoreSubmodules (shows 'modified sub' where git is clean); grit status says 'Changed: modified sub' while grit commit says 'nothing to commit' for a dirty submodule
  • ›Unfiled (minor UX): grit pick --abort on a git-started cherry-pick says 'branch tip moved since the pick started'; reflog selectors @{yesterday}/@{one.minute.ago} unsupported and @{<date>} uses midnight
  • ›Unfiled (minor): grit log -n 20000 peaks 75 MB vs git 26 MB on cargo (2.9x); status peak 19.7 MB vs 7 MB with midx (absolute numbers tiny)
  • ›Unfiled: grit config --list prints every secret value from the user's global config (same as git config --list; not a bug, but worth remembering for the --markdown/--json agent outputs)
  • ›Unfiled: grit commit while a plain `mv README.md readme.md` case-rename is pending reports 'clean' in status but then records a rename in the commit (inconsistent, arguably better than git, too minor)
bugs filed5
#2199 #2200 #2201 #2202 #2203already reported: #1814 #1884 #1859
next time
  • ›Real git-lfs flows over HTTP (git-lfs is not installed on this machine, and the global config has filter.lfs.required=true): push with pre-push hook, locks, post-checkout, git lfs fsck after grit commit
  • ›Re-verify #1814 (sparse cone): switch/merge/reset/stash all kept out-of-cone files unmaterialised on this build, so it may be closeable; also test `git sparse-checkout reapply/disable` after grit operations on a sparse-index repo and grit status performance with sparse index on a large monorepo
  • ›hasconfig/includeIf variants after #2199 is fixed (remote added after commit, worktree config, relative include paths, ~ expansion)
  • ›Submodule workflows against a real upstream: grit switch/reset across bumps with dirty/untracked submodule content, nested submodules, submodule.recurse, status for dirty submodules vs git
  • ›Hook parity matrix after #2201: prepare-commit-msg sources (message/merge/squash/commit), pre-push, pre-auto-gc, reference-transaction, post-checkout from worktree add; core.hooksPath from subdirectories and linked worktrees
  • ›Large-scale concurrency: git gc --auto racing grit commit on cargo-size repos with index.lock contention and kill -9 recovery; SHA-256 repos made by git; alternates and shallow clones made by git
  • ›fsck --connectivity-only and log -S/-G performance after fixes; blame -L ranges vs git on git/git; MIDX memory with millions of objects