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.
| repo | files | commits | .git | notes |
|---|---|---|---|---|
| rust-lang/cargo | 3,083 | 23,605 | 83 MB | bare mirror plus many clones; blobless and shallow variants; served via grit serve |
| git/git | 4,857 | 82,616 | 326 MB | diff/log/blame/fetch/push benchmarks and merge-heavy rebase |
| octocat/Hello-World | 1 | 3 | 1 MB | cloned only |
| scratch repos (/tmp/mm, /tmp/cf, /tmp/ab, tg-*) | 3 | 3 | 1 MB | minimal repros |
| command | repo | grit | git | grit/git | result | notes |
|---|---|---|---|---|---|---|
| grit rebase origin/master (60 Cargo.toml commits) | rust-lang/cargo | 1.74 s | 760 ms | 2.3× | ok | release 0.5.24: 7680 ms; trees identical |
| grit rebase origin/master (30 commits editing a moved file) | rust-lang/cargo | 5.53 s | 890 ms | 6.2× | slow | 6x; #2271 reopened |
| grit rebase origin/master (3-branch stack, 30 commits) | rust-lang/cargo | 3.40 s | 895 ms | 3.8× | slow | 3.8x vs git rebase --update-refs; trees and refs equal |
| grit rebase origin/master (30 no-ff topic merges, 183 steps) | git/git | 3.85 s | 1.88 s | 2.0× | ok | vs git rebase --rebase-merges; trees equal |
| grit rebase main (HEAD = only merges at fork point) | scratch/mm | — | — | — | wrong | Already up to date, replays nothing (#2321) |
| grit diff --shortstat origin/master~100 origin/master | git/git | 100 ms | 180 ms | 0.6× | ok | |
| grit diff --shortstat origin/master~1000 origin/master | git/git | 200 ms | 420 ms | 0.5× | ok | |
| grit clone --blobs none file:// | rust-lang/cargo | 2.64 s | 2.64 s | 1.0× | ok | |
| grit diff --shortstat HEAD~200 HEAD (blobless) | rust-lang/cargo | 610 ms | 610 ms | 1.0× | ok | +10 packs vs +1 |
| grit diff --shortstat HEAD~300 HEAD (blobless) | rust-lang/cargo | 4.62 s | 650 ms | 7.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/cargo | 20.59 s | — | — | slow | +703 packs; git comparison not measured |
| grit log --oneline --merges -n 20 | git/git | 694 ms | 1.9 ms | 365× | slow | #2324; also --no-merges 685 ms vs 2.8, --first-parent 178 ms vs 1.7 |
| grit log --oneline --merges -n 20 | rust-lang/cargo | 177 ms | 2.0 ms | 89× | slow | #2324 |
| grit log --oneline -n 2000 | git/git | 21 ms | 21 ms | 1.0× | ok | |
| grit log --oneline -S rebase_merges -n 20 | git/git | 4.59 s | 7.22 s | 0.6× | ok | |
| grit blame builtin/log.c | git/git | 549 ms | 588 ms | 0.9× | ok | |
| grit merge-base origin/master~3000 origin/master | git/git | 32 ms | 234 ms | 0.1× | ok | |
| grit status (clean) | git/git | 7.9 ms | 6.6 ms | 1.2× | ok | |
| grit fetch (20 new commits) | git/git | 10 ms | 170 ms | 0.1× | ok | |
| grit fetch (full, empty repo) | git/git | 27.36 s | 21.18 s | 1.3× | ok | 1.8x memory |
| grit push master (first push of 85k commits, file path) | git/git | 19.18 s | 19.62 s | 1.0× | ok | 1.76x memory; fsck clean |
| grit clone http://token@grit-serve (full) | rust-lang/cargo | 3.15 s | 5.18 s | 0.6× | memory | 2.7x git's peak memory; faster wall time |
| grit clone --depth 1 / fetch --deepen 50 / --unshallow | rust-lang/cargo | 590 ms | 630 ms | 0.9× | ok | deepen gives 725 commits in both |
| grit fetch (after tag moved on remote) | scratch/tg | — | — | — | wrong | exit 1, 'did not move' (#2326) |
| grit push --force-with-lease (stale vs fresh) | rust-lang/cargo | — | — | — | ok | stale rejected, fresh accepted |
| grit fetch --prune | rust-lang/cargo | — | — | — | ok | branch shows [gone] |
| grit pick -x / tag -a / push --tags / merge --no-ff --check | rust-lang/cargo | — | — | — | ok | |
| grit rebase --exec 'test ! -f e3.txt' (fails midway) | rust-lang/cargo | — | — | — | ok | atomic abort, error does not name the failing commit |
| grit worktree add/remove | rust-lang/cargo | — | — | — | ok | dirty worktree refused without --force |
| grit pull --autostash (conflicting) | rust-lang/cargo | — | — | — | ok | stash kept on conflict like git |
| grit commit (ssh-signed via commit.gpgsign) | scratch/sg | 22 ms | — | — | ok | git log --show-signature: Good signature |
| grit-lib triage program (left_right_counts, is_ancestor, patch_ids_for_revs) | rust-lang/cargo | 170 ms | — | — | ok | matches git rev-list --left-right and git cherry |