grit://cooking/dogfood← what’s cooking
Thursday, October 29, 2026 · macOS 15.7 (Darwin 24.6.0)

Dogfood on scott-mbp: Team developer

6 repos · 31 commands · 1 broken · 7 slow · 5 filed

As a team developer on macOS I ran shared-remote flows (git + grit clones, rebase onto a moving main, force-with-lease, prune/tracking, hotfix cherry-pick to a release branch, tags, cross-tool abort/continue, concurrent pushers), plus cargo/git-scale rebases, blobless/shallow clones and APFS case/unicode edge cases. Everyday collaboration is correct and interoperates with git (identical trees and fsck-clean). Main does not compile on macOS (#2270), and I filed three perf bugs (#2271 rebase over renamed paths, #2273 diff content, #2275 blobless diff fetch batching) plus a data-corruption hazard on directory-case collisions (#2272). All six 're-check' fixes verified fixed.

os
macOS 15.7 (Darwin 24.6.0) · arm64
machine
scott-mbp (Apple M3, 24 GB RAM, APFS case-insensitive); scratch dir /tmp/grit-dogfood-5448
versions
grit 0.5.0 (installed); main workspace version 0.5.24 · main f9813499 · 2.52.0
repositories6
repofilescommits.gitnotes
rust-lang/cargo2,75620,01586 MBbare mirror used as team remote (23.6k commits on master); feature branches feat1..feat4 forked 3641 commits back; blobless/shallow clones over file://
git/git4,85782,628324 MBstacked-branch rebase with merge, 600-commit fetch, diff ranges, https shallow clone
octocat/Hello-World131 MBhttps clone smoke test
scratch/team (alice, bob, carol + bare remote)30301 MB3-person flow with tags, release branch, symlinks, exec bit, unicode names
scratch/case-collision remotes711 MBtree with README.md/readme.md, Docs/docs, NFC name; branches Release and release in packed-refs
scratch/concurrency (6 pushers)91911 MB3 grit + 3 git pushing 15 commits each to one branch
commandsgrit vs. system git, wall time
commandrepogritgitgrit/gitresultnotes
grit clone <local bare> (cargo)rust-lang/cargo250 ms280 ms0.9×okfsck clean
grit rebase origin/master (60 commits editing src/cargo/lib.rs, +3641)rust-lang/cargo10.61 s1.45 s7.3×slow#2271; identical tree
grit rebase origin/master (60 commits editing Cargo.toml)rust-lang/cargo10.72 s1.23 s8.7×slow#2271
grit rebase origin/master (60 add-only commits)rust-lang/cargo620 ms1.44 s0.4×ok#2263 fixed
grit rebase origin/master (60 edits to untouched file)rust-lang/cargo630 ms1.34 s0.5×ok
grit clone --blobs none file://rust-lang/cargo1.89 s2.16 s0.9×oksame missing-blob count as git
grit diff --shortstat HEAD~200 HEAD (blobless)rust-lang/cargo5.66 s360 ms16×slow#2275: 552 packs vs 1
grit blame Cargo.toml (blobless)rust-lang/cargo38.12 s27.36 s1.4×okboth slow from per-blob round trips
grit log -p -n 30 -- Cargo.toml (blobless)rust-lang/cargo410 ms620 ms0.7×ok
grit switch --detach HEAD~1000 (blobless)rust-lang/cargo600 ms550 ms1.1×ok
grit clone --depth 5 / push / fetch --deepen 20 / --unshallowrust-lang/cargo200 ms——okunshallow 0.20 s; fsck clean; shallow push accepted by git fsck
grit rebase origin/master (1 commit, +600)git/git990 ms720 ms1.4×ok#2211 fixed
grit rebase origin/master (3-branch stack with merge, --update-refs default)git/git720 ms840 ms0.9×okgit rebase --rebase-merges --update-refs: identical trees for s1,s2,s3,side
grit rebase -X theirs origin/master (12 conflicting commits)git/git910 ms960 ms0.9×okidentical tree
grit diff --shortstat origin/master~100 origin/mastergit/git1.25 s92 ms14×slow#2273
grit diff --shortstat v2.40.0 v2.45.0git/git1.01 s220 ms4.6×memory#2273: 4.6x slower, 2.6x RSS
grit diff origin/master..origin/seen (453 commits)git/git360 ms70 ms5.1×slow#2273
grit diff origin/master...origin/seengit/git350 ms130 ms2.7×ok
grit log --oneline origin/master..origin/seengit/git10 ms10 ms1.0×ok
grit blame Makefilegit/git1.07 s940 ms1.1×ok
grit log --oneline -n 30 -- Documentation/git-rebase.adocgit/git300 ms730 ms0.4×okfaster than git; #1619 no longer reproduces on this path
grit status / log -n 200 / branch -a / tag / fetch (noop) / push --dry-run / merge-basegit/git10 ms10 ms1.0×okall <=10 ms on a clean tree
grit fetch origin (600 new commits, file://)git/git910 ms2.30 s0.4×ok
grit push (500-commit branch / 3-commit branch)git/git200 ms250 ms0.8×ok3-commit branch: grit <10 ms vs git 50 ms
grit clone --depth 1 https://github.com/git/gitgit/git5.01 s5.06 s1.0×memory2.5x git's RSS; not filed (report cap)
grit fetch --deepen 50 (https, depth-1 clone)git/git27.40 s98.87 s0.3×ok3.6x faster than git; same 8428 commits
grit clone https://github.com/octocat/Hello-Worldoctocat/Hello-World1.00 s680 ms1.5×ok
grit clone / commit on case-colliding treescratch/case-collision remotes———wrong#2272
grit pick/merge/rebase --continue/--abort across gitscratch/team (alice, bob, carol + bare remote)———ok
grit push (3 grit + 3 git concurrent, 90 commits)scratch/concurrency (6 pushers)———ok
grit --json / --markdown on 23 commandsscratch/team (alice, bob, carol + bare remote)———okall outputs parse; usage errors are JSON too
worked8
  • ›Rebase results (tree and topology) match git rebase --rebase-merges --update-refs on a 3-branch stack with a merge at git/git scale
  • ›Cross-tool interoperability: git can --continue/--abort grit pick/merge/rebase stops and grit can finish git's pick/merge stops
  • ›Concurrent pushers (3 grit + 3 git) lost nothing; force-with-lease rejects stale refs, including after a teammate pushes
  • ›fetch (600 commits) 2.5x faster than git and fetch --deepen over https 3.6x faster; push, status, log, branch are at git speed
  • ›Blobless clone parity with git, shallow clone/push/deepen/unshallow correct and fsck-clean
  • ›APFS: clone warns about collisions, Release/release branches both survive, NFC/NFD names are stored precomposed like git
  • ›patch-id output is byte-identical to git patch-id --stable
  • ›rebase --continue/--skip now write 'rebase: continue/skip' to the HEAD reflog (#2154 looks fixed on main); #2225 (update-refs left behind) did not reproduce with 3-branch stacks
problems13
  • ›Main does not compile on macOS: libc::mode_t is u16 in finalize_pack_file_mode (filed #2270)
  • ›Rebase replay falls off the #2263 fast path when a commit edits a path touched by upstream renames: 10.7 s vs 1.2 s on cargo (filed #2271)
  • ›Directory-level case collision (Docs/ vs docs/): an unrelated grit commit rewrites Docs/guide.md from docs/guide.md (filed #2272)
  • ›grit diff of text-heavy ranges 5-14x slower than git on git/git (po files), 2-3x RSS (filed #2273)
  • ›Blobless clone: grit diff A B lazy-fetches blob by blob, 552 packs vs 1 (filed #2275)
  • ›Not filed (report cap): rebase --exec failure says only 'command failed (exit 1)' with no commit id/subject in human, --json or --markdown, so a script cannot tell which commit to fix; the branch is rolled back (documented) so fix-and-continue is impossible
  • ›Not filed: grit clone --depth 1 https git/git peaks at 88 MB vs git 36 MB (2.5x)
  • ›Not filed: grit pull --ff-only on a diverged branch exits 128 while --help says exit 1
  • ›Not filed: after a local rebase, a rejected non-ff push hints 'run grit pull first', which would rebase the rewritten history back; --force-with-lease=<ref>:<expect> gives 'could not resolve revision'
  • ›Not filed: rebase of a merge replays the side branch's commits as new commits on their old fork point instead of moving them on top of the new base like git --rebase-merges (same trees, but needless new ids)
  • ›Not filed: log/shortlog print '-> more: grit log' hints on stdout when piped
  • ›No range-diff / cherry equivalent in the CLI for reviewing a force-pushed rewrite (feature gap, patch-id comparison is the only tool)
  • ›grit diff whole-range --shortstat counts differ from git by 3 lines on git/git (95198+/15624- vs 95201+/15627-): different but valid minimal hunks
bugs filed5
#2270 #2271 #2272 #2273 #2275
next time
  • ›Re-run #2271 and #2275 after fixes; also try the overlap rebase with --update-refs stacks of 3+ branches on cargo
  • ›Real ssh remote with 50k+ refs and concurrent pushers on macOS; git/git rebase --rebase-merges parity with deeper merge-heavy stacks (200+ commits)
  • ›pull --rebase conflict recovery (#1909) combined with git resuming; hooks (#2201) in a team flow with grit-http-server protected branches
  • ›Library persona: build range-diff on grit-lib diff and patch-id APIs to see what primitive is missing
  • ›Case-collision matrix beyond clone: switch/pick/merge/rebase over branches whose trees collide on APFS, with directory-level collisions and renames
  • ›Blobless clones over the http server: blame, rebase and merge lazy-fetch batching; check promisor pack count after each command