grit://cooking/dogfood← what’s cooking
Thursday, October 29, 2026 · Ubuntu 24.04 (Linux 6.12)

Dogfood on linux-cloud: Git power user switching over

5 repos · 37 commands · 5 broken · 5 slow · 5 filed

Played a git power user on a Linux cloud VM: git-built repos (commit-graph with changed-paths, MIDX+bitmaps, split index, packed refs, worktrees, LFS, config includes, bare, separate-git-dir), alternating git and grit through a day of work, hook/reflog/history-edit/rebase/stash interop, kill -9 and concurrency, and cargo + git/git perf. On-disk interop is very solid (git fsck --strict stayed clean after every mixed session, git continued a grit-stopped rebase and vice versa), but path-limited log/revs is badly broken for cwd-relative and wildcard pathspecs, plus several config/rev-syntax compat gaps. 5 of 6 'fixed' issues verified; #2230 still reproduces with the default page limit.

os
Ubuntu 24.04 (Linux 6.12) · x86_64
machine
Cursor cloud VM, 4 vCPU Intel Xeon, 15 GB RAM
versions
grit 0.5.24 · main e84d7c9d · 2.43.0
repositories5
repofilescommits.gitnotes
rust-lang/cargo3,07823,59681 MB
git/git4,85782,616330 MBwith commit-graph --changed-paths
octocat/Hello-World131 MBcloned, not used
scratch/adv (cargo clone with bitmap+MIDX+split index+commit-graph)3,08223,61286 MB
scratch/hist, xop, st, pg, r2, slash, rt, attr, crlf, fn, lfsrepo, super, s256, wtm, hk (small scenario repos)8752 MB
commandsgrit vs. system git, wall time
commandrepogritgitgrit/gitresultnotes
grit status (clean)git/git8.2 ms6.9 ms1.2×ok
grit log -n 100000 --onelinegit/git714 ms654 ms1.1×ok1.75x RSS
grit revs --count HEADgit/git27 ms47 ms0.6×ok
grit blame -L 1,50 builtin/log.cgit/git181 ms221 ms0.8×ok
grit blame builtin/log.cgit/git330 ms312 ms1.1×ok
grit diff HEAD~100..HEAD --statgit/git102 ms204 ms0.5×ok
grit show --stat HEAD~5git/git3.3 ms2.6 ms1.3×ok
grit log -S blame_entry -n 20 --onelinegit/git8.44 s12.93 s0.7×ok
grit merge-base HEAD~5000 HEAD~3000git/git6.6 ms31 ms0.2×ok
grit log --since=2025-06-01 --author=nomatch --oneline (default page)git/git648 ms52 ms13×slow#2230 not fixed; with -n 100000: 44.5 ms
grit log --since=2026-10-01 --oneline -- Makefile (default page)git/git251 ms3.4 ms74×slow#2230
grit log --since=2025-01-01 --oneline -- builtin/log.cgit/git127 ms12 ms11×slow#2230 (10x)
grit log --oneline -- builtin/log.cgit/git134 ms117 ms1.1×ok
grit log -- '*/log.c' (wildcard pathspec)git/git———wrongNo commits yet.; git lists commits (#2299)
grit log -- log.c (from builtin/)git/git———wrongNo commits yet. (#2298)
grit switch --detach HEAD~20000git/git380 ms300 ms1.3×ok
grit switch master (back, 20000 commits)git/git820 ms340 ms2.4×ok2.4x slower, 1.7x RSS; below the 3x bar
grit reset --hard HEAD~3000git/git420 ms350 ms1.2×ok
grit merge (c1ab07b^2 into c1ab07b^1, 4850 files)git/git700 ms990 ms0.7×okidentical result tree
grit add + commit (986 modified .c/.h files)git/git150 ms270 ms0.6×okadd 80 ms + commit 70 ms vs git add 260 ms + commit 10 ms; tree identical
grit clone --depth 50 file://git/git8.16 s8.07 s1.0×ok
grit clone --blobs none file://git/git7.56 s8.78 s0.9×ok
grit status (clean)rust-lang/cargo14 ms12 ms1.2×ok2.9x RSS but absolute 18 MB
grit log -n 100000 --onelinerust-lang/cargo198 ms172 ms1.1×memory2.6x RSS
grit revs --count --allrust-lang/cargo188 ms148 ms1.3×ok
grit diff HEAD~1000..HEAD --statrust-lang/cargo200 ms312 ms0.6×ok
grit fsck (vs git fsck --connectivity-only)rust-lang/cargo1.56 s469 ms3.3×slow3.3x; grit fsck does a fuller check (vs git fsck --strict 5.7 s on adv, grit 1.6 s) so not filed
grit log -S Workspace -n 10rust-lang/cargo113 ms188 ms0.6×ok
grit gc (--shared clone)rust-lang/cargo580 ms720 ms0.8×ok#2223 fixed
grit gc (all-into-one with loose objects)rust-lang/cargo1.90 s——okignores pack.writeBitmaps/gc.writeCommitGraph/gc.packRefs (#2301)
grit clone https://github.com/rust-lang/cargorust-lang/cargo2.54 s4.09 s0.6×okfsck --strict clean, refs identical
grit history reword/drop/squash/fixup/split/absorb/undoscratch/hist80 ms——okfsck --strict clean, incl. rewriting below a merge commit
grit rebase (conflict) then git rebase --continuescratch/xop———ok
grit status during git bisect / cherry-pick on detached HEADrust-lang/cargo———wrongempty branch name, operation unnamed (UX; not filed, cap reached)
grit worktree add <path> master (bare repo)scratch/bare———error#2305
grit resolve ':/feature'scratch/slash———wrong#2300
grit commit with commit.gpgsign=true via ssh signing helperscratch/hist———okenvironment's signing helper intermittently took 4-20 s; grit holds index.lock while signing (git does not stall here since its commits were unsigned in this env); not a grit bug per se
worked11
  • ›git fsck --strict, commit-graph verify and multi-pack-index verify stay clean after mixed git/grit sessions on repos with split index, packed refs, bitmaps, MIDX
  • ›grit writes a fresh sharedindex for split-index repos; git reads it
  • ›git rebase stopped by conflict is detected and protected by grit; a grit rebase stopped on conflict is finished by git rebase --continue (git's rebase-merge format)
  • ›grit history reword/drop/squash/fixup/split/absorb/undo, including below merge commits, give fsck-clean graphs and sensible reflog entries
  • ›reference-transaction, post-checkout (worktree add), post-rewrite, pre-push, prepare-commit-msg, commit-msg and merge hooks fire in git's order
  • ›CRLF/autocrlf/eol/ident/filter attributes, gitignore rules (45 paths vs check-ignore), config include/includeIf, per-worktree config, odd/unicode filenames and symlinks match git byte for byte
  • ›git-lfs pointers produced by grit commit pass git lfs fsck
  • ›kill -9 during grit commit and grit gc never corrupts the repo; stale locks name the dead pid
  • ›git stash <-> grit stash push/pop/show interop including untracked files
  • ›sha256 repos: commit/gc/clone/push/bundle round-trip with git
  • ›clone over HTTPS of cargo is faster than git (2.5 s vs 4.1 s)
problems11
  • ›#2298 grit log/revs -- <path> from any subdirectory finds nothing (double cwd resolution; regression of #1218)
  • ›#2299 grit log/revs wildcard/:(glob)/:(icase) pathspecs that must descend into directories return nothing
  • ›#2300 :/text picks first matching ref, not the youngest commit across refs
  • ›#2301 grit gc ignores gc.writeCommitGraph=false, gc.packRefs=false and pack.writeBitmaps; also removes an empty .git/refs/heads dir
  • ›#2305 worktree add of a bare repo's HEAD branch refused; human worktree list lacks (bare)
  • ›#2230 reopened: --since + filter still scans all history under the default page limit
  • ›NOT FILED (report cap reached): grit-lib API: RevWalkListOptions::paths are silently cwd-relative (depends on process cwd captured at Repository::discover), undocumented, root-relative only via ':(top)'; resolve done inside RevWalk so already-resolved paths get re-prefixed (cause of #2298); suggest a typed ResolvedPathspecs
  • ›NOT FILED: grit status prints 'On · operation in progress' with an empty branch name (markdown: On **``**) when HEAD is detached during bisect or cherry-pick/revert; human output never names the operation (JSON has in_progress). `grit log --author=nomatch` in a repo with history prints 'No commits yet.' (misleading; --json is fine)
  • ›NOT FILED (nit): vetoed grit commit sends reference-transaction 'prepared' but never 'aborted'; Already-up-to-date merge writes ORIG_HEAD through a transaction, and when vetoed prints 'the merge is still in progress: run grit merge --continue' though no merge state exists
  • ›NOT FILED (nit): grit baseline RSS is ~10-13 MB above git on tiny commands (status 18 MB vs 6 MB, tag 13 MB vs 4.8 MB), log --oneline 1.75-2.6x git
  • ›NOT FILED (nit): grit fsck on cargo is 3.3x git fsck --connectivity-only but it does a full check; grit add -A / grit commit -qm not accepted (add takes no -A; fine by design)
bugs filed5
#2298 #2299 #2300 #2301 #2305already reported: #1218 #2191 #2201 #1876 #1909
next time
  • ›Re-verify #2298/#2299 once fixed with the whole pathspec magic matrix (:(glob), :(icase), :(attr), :(exclude)) in log, revs, blame, show, diff, add, restore, stash push -- <paths> from root and from nested subdirectories
  • ›Real HTTPS push to GitHub with a credential helper and the receiving-side hook matrix (not possible without credentials in this session)
  • ›Reftable repositories once system git >= 2.45 is available (this VM has 2.43); reference-transaction for symref HEAD updates
  • ›MIDX with several packs and millions of objects: memory for status/log; git gc --auto racing grit commit at git/git scale with kill -9 and strict fsck
  • ›git lfs locks/verify during grit push and git lfs migrate/prune after grit history rewrites; real LFS server over HTTP
  • ›Signing: grit commit/history/rebase with ssh and gpg signatures verified by git log --show-signature; check grit does not hold index.lock while the signer runs
  • ›gc config coverage: gc.pruneExpire, gc.reflogExpire*, gc.bigPackThreshold, gc.cruftPacks, pack.window/depth/threads, core.bigFileThreshold, repack.writeBitmaps with MIDX
  • ›log --author -n 5000 and path-limited log on git/git with a Bloom-filter commit-graph vs git (this session: path log 134 vs 117 ms, ok), plus clean-status memory with sparse index on a big monorepo