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

Dogfood on linux-cloud: Team developer

4 repos · 32 commands · 2 broken · 7 slow · 4 filed

Team-developer dogfood on a Linux cloud VM: re-checked 4 fixed issues, ran three-clone git/grit team flows on cargo, a grit serve token-authenticated team, stacked and merge-heavy rebases on cargo and git/git, hotfix/tag/prune/lease flows, and a small grit-lib triage program. Everyday flows interoperate with git (trees identical, fsck clean, cross-tool rebase/cherry-pick continue works), but I found a rebase regression on main, a moved-file rebase perf gap that reopened #2271, a log --merges/--first-parent full-history walk, a tag-moved fetch exit-code problem, and a lazy-fetch batching cliff on larger blobless diffs.

os
Ubuntu (Linux 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
repositories4
repofilescommits.gitnotes
rust-lang/cargo3,08323,60583 MBbare mirror plus many clones; blobless and shallow variants; served via grit serve
git/git4,85782,616326 MBdiff/log/blame/fetch/push benchmarks and merge-heavy rebase
octocat/Hello-World131 MBcloned only
scratch repos (/tmp/mm, /tmp/cf, /tmp/ab, tg-*)331 MBminimal repros
commandsgrit vs. system git, wall time
commandrepogritgitgrit/gitresultnotes
grit rebase origin/master (60 Cargo.toml commits)rust-lang/cargo1.74 s760 ms2.3×okrelease 0.5.24: 7680 ms; trees identical
grit rebase origin/master (30 commits editing a moved file)rust-lang/cargo5.53 s890 ms6.2×slow6x; #2271 reopened
grit rebase origin/master (3-branch stack, 30 commits)rust-lang/cargo3.40 s895 ms3.8×slow3.8x vs git rebase --update-refs; trees and refs equal
grit rebase origin/master (30 no-ff topic merges, 183 steps)git/git3.85 s1.88 s2.0×okvs git rebase --rebase-merges; trees equal
grit rebase main (HEAD = only merges at fork point)scratch/mm———wrongAlready up to date, replays nothing (#2321)
grit diff --shortstat origin/master~100 origin/mastergit/git100 ms180 ms0.6×ok
grit diff --shortstat origin/master~1000 origin/mastergit/git200 ms420 ms0.5×ok
grit clone --blobs none file://rust-lang/cargo2.64 s2.64 s1.0×ok
grit diff --shortstat HEAD~200 HEAD (blobless)rust-lang/cargo610 ms610 ms1.0×ok+10 packs vs +1
grit diff --shortstat HEAD~300 HEAD (blobless)rust-lang/cargo4.62 s650 ms7.1×slow+318 packs vs +1 (#2327); over HTTP 5260 ms vs git 1200 ms
grit blame Cargo.toml (blobless over HTTP, after diff)rust-lang/cargo20.59 s——slow+703 packs; git comparison not measured
grit log --oneline --merges -n 20git/git694 ms1.9 ms365×slow#2324; also --no-merges 685 ms vs 2.8, --first-parent 178 ms vs 1.7
grit log --oneline --merges -n 20rust-lang/cargo177 ms2.0 ms89×slow#2324
grit log --oneline -n 2000git/git21 ms21 ms1.0×ok
grit log --oneline -S rebase_merges -n 20git/git4.59 s7.22 s0.6×ok
grit blame builtin/log.cgit/git549 ms588 ms0.9×ok
grit merge-base origin/master~3000 origin/mastergit/git32 ms234 ms0.1×ok
grit status (clean)git/git7.9 ms6.6 ms1.2×ok
grit fetch (20 new commits)git/git10 ms170 ms0.1×ok
grit fetch (full, empty repo)git/git27.36 s21.18 s1.3×ok1.8x memory
grit push master (first push of 85k commits, file path)git/git19.18 s19.62 s1.0×ok1.76x memory; fsck clean
grit clone http://token@grit-serve (full)rust-lang/cargo3.15 s5.18 s0.6×memory2.7x git's peak memory; faster wall time
grit clone --depth 1 / fetch --deepen 50 / --unshallowrust-lang/cargo590 ms630 ms0.9×okdeepen gives 725 commits in both
grit fetch (after tag moved on remote)scratch/tg———wrongexit 1, 'did not move' (#2326)
grit push --force-with-lease (stale vs fresh)rust-lang/cargo———okstale rejected, fresh accepted
grit fetch --prunerust-lang/cargo———okbranch shows [gone]
grit pick -x / tag -a / push --tags / merge --no-ff --checkrust-lang/cargo———ok
grit rebase --exec 'test ! -f e3.txt' (fails midway)rust-lang/cargo———okatomic abort, error does not name the failing commit
grit worktree add/removerust-lang/cargo———okdirty worktree refused without --force
grit pull --autostash (conflicting)rust-lang/cargo———okstash kept on conflict like git
grit commit (ssh-signed via commit.gpgsign)scratch/sg22 ms——okgit log --show-signature: Good signature
grit-lib triage program (left_right_counts, is_ancestor, patch_ids_for_revs)rust-lang/cargo170 ms——okmatches git rev-list --left-right and git cherry
worked6
  • ›Cross-tool stopped states: grit rebase conflict finished with git rebase --continue; git cherry-pick sequence continued after grit pick conflict
  • ›force-with-lease semantics (stale remote ref rejected, accepted after fetch), fetch --prune and branch [gone]
  • ›grit serve: tokens, read-only vs write users, 4 mixed pushers racing on one branch all landed, server fsck clean
  • ›Stacked --update-refs rebase with conflict, empty-resolution and --skip; trees and ref tips equal to git
  • ›ssh-signed commits written by grit verify with git; git/git diff, log, blame, merge-base at or ahead of git speed
  • ›grit-lib API: a branch-triage program compiled on the first try and matched git rev-list and git cherry
problems15
  • ›#2321 (filed): rebase 'Already up to date' for a branch consisting only of --no-ff merges at the fork point; regression vs release 0.5.24
  • ›#2324 (filed): log --merges/--no-merges/--first-parent -n 20 walk the whole history (0.7 s vs 2 ms on git/git)
  • ›#2326 (filed): plain fetch exits 1 on every run after a remote tag moves, reason text 'did not move' is wrong, no --force
  • ›#2327 (filed): blobless diff lazy-fetch batching collapses above ~1000 blobs (+318 packs, 4.6 s vs 0.65 s)
  • ›#2271 reopened via verify_fix: moved-file rebase still 6x slower; 3-branch stack 3.8x
  • ›Not filed: rebase --exec failure does not name the failing commit or capture its output, and there is no stop-and-fix-and-continue (atomic abort); minor and a design choice
  • ›Not filed: 'grit push' rejection after a rebase says 'run grit pull first', which would merge the old tip; hint should mention --force-with-lease
  • ›Not filed: grit merge while a merge is unfinished says 'local changes would be overwritten' instead of 'merge in progress'
  • ›Not filed: rebase with a resolved-to-empty commit says 'nothing to commit after conflict resolution' without suggesting --skip
  • ›Not filed: grit clone --blobs none against a server without uploadpack.allowFilter silently downloads the full repo (git warns); push 403 shows only 'HTTP 403' while git shows the server's reason
  • ›Not filed: grit rebase keeps merge commits by default and has no flatten/--rebase-merges switch; differs from git's default linearising rebase (trees equal)
  • ›Not filed: grit clone over HTTP peak memory 2.7x git (122 MB vs 45 MB) although faster; grit fetch full and first push are 1.8x git
  • ›Not filed: ObjectFilter::parse returns Result<_, String> (stringly error) and RevWalk takes revision strings; minor api findings
  • ›Environment note, not a grit bug: this VM has commit.gpgsign=true with a slow ssh agent, so commit-creating commands (grit and git) stalled for seconds until I used a private GIT_CONFIG_GLOBAL; also cargo outside the workspace picks rustc 1.83 so grit-lib path deps need cargo +1.99.0
  • ›#2270 and #2272 are macOS-only and could not be verified on Linux (kernel lacks ext4 casefold for a case-insensitive test)
bugs filed4
#2321 #2324 #2326 #2327already reported: #2225 #2201 #1909 #2154
next time
  • ›Re-run the moved-file rebase (#2271) and the 3-branch stack after the next fix; try 200+ replayed commits with 1000+ upstream renames and --update-refs stacks of 5 branches
  • ›Blobless clones over HTTP: batching cliff (#2327), then blame, rebase and merge lazy-fetch with promisor pack count after each command; make the client warn when the server ignores the filter
  • ›log --merges / --first-parent after #2324 is fixed: also shortlog/ahead, revs --merges and path-limited variants on git/git and linux-scale history
  • ›Tag workflows for release managers: moved and deleted tags with fetch --prune-tags, push --follow-tags, signed tags across git and grit
  • ›A real macOS/APFS run for #2270 and #2272 (case-colliding directories through switch/pick/merge/rebase)
  • ›grit serve under load: 20 concurrent clients, protected branch via hooks, bundle rebuild after pushes, token revocation
  • ›Library persona: range-diff built on patch_ids_for_revs plus diff APIs; check which primitive is missing and whether typed revision selectors exist instead of strings