grit://cooking/dogfood← what’s cooking
Wednesday, October 28, 2026 · Windows 11 (10.0.26200)

Dogfood on win-x64: Team developer

6 repos · 33 commands · 5 broken · 1 slow · 5 filed

Played a team developer on win-x64: mixed git/grit clones of a shared bare remote and of grit serve over HTTP, rebase/merge/pick with conflicts, force-with-lease, prune, tags, worktree review, Windows-specific filesystem cases (autocrlf, case collisions, locked/read-only files, unicode), plus cargo and git/git scale checks. All 6 fixed issues re-verified as fixed. Core collaboration flows interoperate cleanly with git (fsck clean, identical trees to git rebase -r --update-refs); I filed 5 new problems (stuck rebase abort, D/F ref errors, history drop attribution, rebase marker labels, slow rebase apply).

os
Windows 11 (10.0.26200) · x86_64
machine
win-x64 self-hosted worker; Intel i5-12400, 16 GB RAM, NTFS
versions
grit 0.5.23 (built from source) · main eb2680ab · 2.55.0.windows.5 (system config: core.autocrlf=true, core.symlinks=false, lfs filter required)
repositories6
repofilescommits.gitnotes
git/git4,85782,605323 MBcloned --no-checkout, then local clones via git --no-local and grit
rust-lang/cargo3,07823,58881 MB
octocat/Hello-World110.1 MBdepth 1, setup only
scratch/team (alice/bob/carol clones, remote.git)6120.1 MBmixed git/grit clones, CRLF, rebase/force-with-lease
scratch/cc2 (6 concurrent pushers)31000.2 MB
scratch/misc (case collisions, unicode, md, ro, ab, hd, df*, cf)860.1 MB
commandsgrit vs. system git, wall time
commandrepogritgitgrit/gitresultnotes
grit clone (local path, full)rust-lang/cargo1.84 s1.08 s1.7×okgit used hardlinked local clone
grit clone (local path vs git --no-local)git/git6.96 s29.80 s0.2×okgrit 4x faster
grit clone over HTTP from grit serverust-lang/cargo4.50 s5.96 s0.8×okgit peak not measurable via wrapper; server peak WS 336 MB
grit push master over HTTP to grit serverust-lang/cargo10.11 s——ok
grit clone --depth 5rust-lang/cargo1.55 s2.33 s0.7×ok
grit clone --blobs nonerust-lang/cargo11.27 s19.80 s0.6×oksame object counts as git --filter=blob:none (server ignores filter)
grit fetch (40 new commits, new branch)rust-lang/cargo300 ms330 ms0.9×ok
grit fetch (no-op)rust-lang/cargo20 ms305 ms0.1×ok
grit status (clean)rust-lang/cargo179 ms155 ms1.2×ok
grit status (clean)git/git97 ms36 ms2.7×ok2.7x, under the 3x bar; see #1702
grit revs HEAD~20..HEADgit/git17 ms33 ms0.5×ok
grit revs --count A...Bgit/git13 ms44 ms0.3×ok
grit log --oneline -- builtin/commit.cgit/git574 ms596 ms1.0×ok
grit blame builtin/commit.cgit/git667 ms591 ms1.1×ok
grit blame Makefilegit/git1.36 s1.07 s1.3×okattribution of builtin/rebase.c identical to git (1938/1938 lines)
grit diff v2.40.0 v2.45.0 --statgit/git329 ms379 ms0.9×ok
grit revs --count HEADgit/git734 ms606 ms1.2×ok
grit switch --detach v2.30.0 / back to mastergit/git1.44 s1.51 s1.0×okback: 1596 vs 1650
grit reset --hard across 1451 changed filesgit/git510 ms790 ms0.6×ok
grit rebase master (60 commits, master +600)git/git9.04 s3.17 s2.8×slow#2211; 1 commit: 6547 vs 1106 ms
grit rebase master --dry-run / --checkgit/git885 ms——okplanning is fast; apply phase is slow
grit rebase main-moving (9 commits, merge + dup, update-refs)rust-lang/cargo501 ms——oktree identical to git rebase -r --update-refs
grit merge --no-ff (121-file conflict) / -X theirsrust-lang/cargo457 ms——ok
grit pick -x with conflict + --continuerust-lang/cargo———ok
grit fetch (D/F ref conflict, no prune)scratch/df3———error#2198 raw 'corrupt ref store: I/O error: Access is denied'
grit branch rel (rel/1.0 exists)scratch/dfy———error#2198
grit rebase --abort after exec_dirty + moved refscratch/ab2———error#2197 repo stuck
grit history drop topic~1 (sibling branch conflict)scratch/hd———wrong#2204 unattributed conflict
grit rebase (conflict markers)scratch/ab———wrong#2207 label is file path
grit push --atomic over HTTP with update hookscratch/srv———ok
grit push --force-with-lease (stale, then after fetch)scratch/team———ok
grit worktree add/remove/list with spaces in pathscratch/cc2———ok
grit switch with login.txt locked (FileShare.None)scratch/team———okclear error, nothing partially applied
worked10
  • ›Mixed git/grit collaboration on a bare remote: refs, history and fsck always clean; system autocrlf=true honored and index stays LF
  • ›Stacked rebase with merge commit, cherry-picked duplicate and update-refs gives the same tree as git rebase -r --update-refs on cargo
  • ›merge --check, --no-ff, -X theirs, delete/modify, rename/rename and binary conflicts match git merge-tree's index; git merge --abort works on a grit merge
  • ›Case-colliding paths: warning like git, grit commit does not record phantom deletions
  • ›Exec bit (100755) and gitattributes eol preserved when committing from Windows
  • ›Locked and read-only files during switch/reset/stash handled with clear errors and no partial state
  • ›Atomic push over grit serve HTTP with update hook, concurrent pushers: no partial publication, remote fsck clean
  • ›pull.rebase / branch.<name>.rebase honored; commit-msg/pre-commit/pre-push hooks run via sh on Windows; --json hook failure is structured
  • ›Shallow clone, blobless clone parity with git; fetch no-op 20 ms vs git 305 ms; clone git/git 4x faster than git --no-local
  • ›Unicode file and branch names, spaces in paths, worktree review of a teammate's branch
problems11
  • ›#2197 rebase stopped by exec_dirty can't be aborted/continued/skipped once the branch ref moves (filed)
  • ›#2198 ref dir/file conflicts surface as 'I/O error: Access is denied' / 'corrupt ref store'; fetch aborts without hint (filed)
  • ›#2204 history drop/reword conflicts from a sibling branch are unattributed; default --update-refs branches silently rewrites other local branches (filed)
  • ›#2207 rebase conflict markers use the file path as the label (filed)
  • ›#2211 rebase apply phase 3-6x slower than git on git/git (filed)
  • ›Not filed (design/UX): rebase --exec failure exit code rolls back the whole rebase instead of stopping for a fix; exec_dirty only offers stash+continue so a formatter's edits cannot be amended in after the stop ('HEAD changed')
  • ›Not filed (too minor): fetch rejection text for a moved tag says 'tag already exists locally and did not move' (the remote tag moved; git says would clobber existing tag)
  • ›Not filed (duplicate of #2151): grit remote add prints the URL with the password in cleartext
  • ›Not filed (feature gap): no range-diff style pairing/interdiff of rewritten commits; revs --cherry-mark only pairs identical patches
  • ›Not filed: grit clone writes a stale .git/config.lock if the pipe is closed early (killed mid-clone) - expected for a killed process
  • ›Not filed (known #1702 class): grit status 97 ms vs git 36 ms on git/git (2.7x)
bugs filed5
#2197 #2198 #2204 #2207 #2211already reported: #2151 #1702 #1014 #1909
next time
  • ›Profile and fix #2211 apply phase, then retest rebase --update-refs stacks with 3+ branches on git/git and cargo
  • ›Real SSH server (Windows OpenSSH sshd or WSL) with 50k+ refs, concurrent pushers and annotated tag moves
  • ›grit pull --rebase conflict and recovery across tools (#1909) plus abort recovery matrix: move HEAD/branch/index during every stopped state (merge, pick, revert, rebase exec/non-exec)
  • ›Windows long paths (>260), reserved names and symlink-heavy repos in a team flow (#2173, #1812, #1813) with the persona's mixed-OS teammates
  • ›Library persona: program that reproduces what grit rebase does (revwalk range + patch-id + replay) to see which parts need grit-cli
  • ›Large binary/LFS-required repos (system git config has filter.lfs.required=true) through grit commit/switch/rebase