grit://cooking/changelog← what’s cooking
Thursday, October 22, 2026 · release v0.5.17

91 changes landed on main

47 roadmap steps across 8 items · 9 issue fixes · 35 other changes

v0.5.17 adds a library-first surface for branches, tags, fetch/pull/push, merge/pick/revert conflicts, history editing and tree-sha256, plus non-UTF-8 path, empty-tree and SHAttered fixes.

  • ›Pull, push, fetch: --rebase, --autostash, --check, --force-with-lease, -u, --atomic, --all, --depth/--unshallow
  • ›New: merge --continue/--check, multi-commit revert, restore --ours/--theirs/--merge, pick --continue/--abort/--skip
  • ›History: split, undo, reword --author, --empty and --keep-committer on all subcommands
  • ›add -N/-f/-u/--dry-run/--patch-file, commit --dry-run and --date/--trailer/-s/-C, tag -f/-F/--verify, branch rename
  • ›Fixes: non-UTF-8 paths (#1399), FIFOs hanging add (#1400), empty trees (#1401, #1413), diff EOF newline (#1402), SHAttered repos (#1415)
  • ›Faster: blame on git.git 940→385 ms, log --all, pick/revert, status, branch create
$ git log d4844e92..v0.5.17297 commits on GitHub ↗300+ files +13,711 −1,695
Highlightsmeasured by the reviewers, before → after
Speed: revs/left-right-count@deep-history
left-right count time, origin/main → branch (git 2.205 ms)33× better████████████████████████ 252.1 ms median, 10 runs █ 7.7 ms median, 10 runs
Speed: pick/one@synth-10k
pick 100k median15× better████████████████████████ 2,898 ms ██ 199.1 ms
Speed: log/all@git-git
log/all time (system Git 44.914 ms)11× better████████████████████████ 751.5 ms median, 10 runs ██ 67.8 ms median, 10 runs
Speed: branch/create@many-refs
branch/create median (system Git after control: 2.214 ms)10× better████████████████████████ 34.4 ms ██ 3.3 ms
Follow-up: tree-sha256 digest engine in grit-lib
1,776-file reference process vs grit-lib in-process median3.8× better████████████████████████ 17.4 ms ██████ 4.6 ms
roadmap · implement tree-sha256 commit/tag headers4 steps
  • ›tree-sha256 digest engine in grit-lib44b47eed

    Adds a linkable tree-sha256 digest engine that hashes canonical path records, recursively includes checked-out submodules, reports exclusions/cycles/missing submodules, and supports SHA-1 and SHA-256 repositories. Round 3 makes the golden vector self-contained by replacing an orphan gitlink with a complete Git bundle and retains the earlier recursion/path fixes.

  • ›tree-sha256 tag header codece2770e17

    Adds a linkable annotated-tag codec for tree-sha256 claims. Callers can read a typed claim from TagData or replace a claim while preserving unrelated tag headers in reference-tool byte order.

  • ›Tag verification API: signature plus recomputed digest29a34bbc

    Adds a public repository API that verifies an annotated tag's appended SSH/OpenPGP signature and, when present, recomputes its tree-sha256 claim concurrently. It returns typed signature and digest verdicts, with documentation, an example binary, and compatibility/coverage tests.

  • ›`grit tag --verify`98edf6c4

    Adds a modern multi-tag verification path that reports signature and tree-sha256 results in human, JSON, and Markdown forms, with exit status reflecting aggregate success. The round-4 correction makes argv preprocessing preserve post-subcommand global option values without regressing multiple tag names.

roadmap · use the SHA1DC library for faster SHA12 steps
  • ›Every object-id producer uses the checked API; remove infallible object hashing93562c5d

    Makes collision-checked hashing the only object-id API and propagates collision errors through object creation, diff, pack, transfer, and worktree paths. Round 3 closes the remaining copy-detection error swallow, fixes the object-hash Criterion closure, and switches the hash benchmark from git.git's intentional collision payloads to an existing synthetic repacked repository.

    Hash smoke: 256 MiB blob median, system git to grit: 5,668 ms → 29,052 ms (80% worse)Hash smoke: synthetic index-pack median, system git to grit: 3.4 ms → 6.9 ms (51% worse)Hash smoke: fsck median, system git to grit: 4.0 ms → 13.0 ms (69% worse)
  • ›After-baselines and benchmarks docs vs system gitb9629421

    Makes SHA-1 object-ID hashing collision-checked and fallible across grit-lib, propagates typed failures through all affected object/pack/diff paths, and removes a redundant large-payload collision pass from loose writes. It commits and registers the after-baseline, updates generated benchmark selection, and documents measured system-git comparisons.

    hash-object -w grit median: 3,972 ms → 3,475 ms (14% better)fsck-medium grit median: 401.3 ms → 327.5 ms (23% better)fresh hash-object -w ratio (grit/git): 0.672 ratio → 0.611 ratio (10% better)object-id micro throughput vs fresh git effective throughput: 0.508 GiB/s → 1.6 GiB/s (3.1× better)
roadmap · Precise commits: status, add, commit5 steps
  • ›add: -u/--update, --dry-run, path lists in JSON60805b45

    Adds update-only and dry-run staging with path-level outcomes across the library and CLI, plus shared pathspec-file parsing and benchmark registrations. The latest fix handles deleted unmerged paths for pathless add -u, but the previously reported dry-run classification bug is still present.

  • ›add P1: -N/--intent-to-add and -f/--force5c56effe

    Adds explicit intent-to-add and force-ignored staging to the library and exposes them as `grit add -N/--intent-to-add` and `-f/--force`. Intent entries use the repository's hash algorithm, serialize in a Git-compatible index, and are reported consistently in human, JSON, and Markdown output; this round fixes the previously missing Markdown path list.

  • ›commit --dry-run and JSON files8a9f0e2a

    Adds side-effect-free commit planning and `grit commit --dry-run`, returning typed per-file status (including rename origins) in library and CLI outcomes without writing objects, index, refs, reflogs, hooks, or commit-message state. The stacked work also supplies scoped commits, author/message/hook handling, reusable pathspec parsing, documentation, compatibility tests, and a daily dry-run benchmark.

    commit/small@synth-10k median: 32.0 ms → 30.5 ms (5% better)commit/small@synth-100k median: 423.2 ms → 376.3 ms (12% better)commit/dry-run@synth-10k median (system git vs branch grit): 11.4 ms → 18.2 ms (37% worse)
  • ›commit P1: --date, --trailer, -s, --reset-author, -C, -S/--no-gpg-sign04ef8877

    Adds the modern commit P1 flags for author dates, trailers/signoff, author reset, message/author reuse, and signing overrides through a library-first `CommitRequest` API and thin CLI wiring. It also restores structured commit outcome/hook metadata, updates public API/docs, and adds CLI/library compatibility coverage against system Git.

    commit-10k grit median: 191.2 ms → 175.2 ms (9% better)commit-10k system git median: 185.5 ms → 193.4 ms (4% worse)commit-10k grit/git ratio: 1.0 ratio → 0.906 ratio (14% better)
  • ›Agent workflow test, skill pass and baseline refresh056cccfc

    Adds an end-to-end agent workflow for precise status, staging, path commits, staged commits, and conflict completion, backed by library-first staging/commit/status APIs and consistent CLI/docs output. The review fixes preserve dry-run state, correctly preview amend metadata, retain intent-to-add paths in Markdown, and restore accepted large-repository benchmark captures.

    status dirty 100k grit median: 93.4 ms → 89.9 ms (4% better)status clean 100k grit median: 92.8 ms → 83.1 ms (12% better)
roadmap · Conflicts you can work through: merge, pick, revert6 steps
  • ›restore --ours/--theirs/--merge/--conflict for conflicted pathse92a7408

    Adds worktree-only conflict restoration for unmerged paths: callers and CLI users can select ours/theirs or reconstruct merge, diff3, or zdiff3 markers. The review fixes make add/add and binary conflict shapes match system Git byte-for-byte while retaining the unmerged index and resolve-undo behavior.

  • ›Library: one conflict and operation model plus shared result JSONc6a7e0f4

    This change centralizes merge-style conflict classification and operation guidance in grit-lib, then exposes structured conflict objects and actionable guidance through merge/pull JSON v2 and shared human/Markdown rendering. The review follow-up preserves both published v1 contracts and corrects snapshots, abort guidance, and generated schema links.

  • ›merge --continue finishes a conflicted or --no-commit merge28909204

    Adds a typed library operation that finishes an in-progress merge from the resolved index, then exposes it as `grit merge --continue`. It preserves Git repository compatibility, stamps the merge commit change-id, clears merge state, and reports stable human/JSON/Markdown next steps and source labels.

  • ›merge --check: predict conflicts in memory222c8cfb

    Adds an in-memory merge prediction API and exposes it as `grit merge --check`, returning clean, conflict, fast-forward, or up-to-date outcomes without modifying repository state. The final review fixes make benchmark execution independent of the grit CLI and ensure human and Markdown text describes predictions rather than completed or started merges.

    10k merge-check median: system git control to branch grit-lib: 1.6 ms → 93.3 ms (98% worse)10k merge-check peak RSS: system git control to branch grit-lib: 16,080,896 bytes → 18,771,968 bytes (14% worse)
  • ›Library: pick/revert sequence engine that stops on conflict73fcc033

    Adds a public multi-commit pick/revert sequence engine that can stop on conflicts or empty changes, persist Git-compatible operation state, and continue, skip, or abort safely. The round-2 patch fixes partial-progress abort restoration, cumulative --no-commit behavior, and Git continuation option interoperability.

  • ›grit revert: several commits, ranges, --mainline, --continue/--abort/--skipf2f316c6

    This stack introduces a reusable `grit-lib` replay-sequence engine and rewires `grit revert` for multi-commit/range operation, merge mainlines, conflict stop/resume/abort/skip, empty policies, no-commit, dry-run, and structured output. It also adds Git sequencer interoperability coverage, public API docs/examples, and expanded CLI schemas/tests.

    Single-revert normalized time vs system Git: 1.8 grit/git ratio → 1.9 grit/git ratio (0% worse)Single-revert grit median: 206.6 ms → 228.1 ms (9% worse)Co-measured system Git median: 112.1 ms → 123.3 ms (9% worse)
roadmap · Remotes: fetch, pull, push11 steps
  • ›grit-lib pull engine; grit pull --ff-only / --no-rebase with pull.ff1fcd1d90

    Pull orchestration now lives in grit-lib, with the CLI reduced to argument forwarding and rendering. It supports up-to-date, fast-forward, merge, ff-only refusal, conflicts, and unborn-branch adoption outcomes, including config-driven pull.ff behavior and correct handling of missing configured upstream refs.

    CLI pull command size: 112 lines → 60 lines (87% better)
  • ›grit-lib: fetch refspec resolution for explicit refspecs65b10002

    Adds typed explicit fetch-refspec resolution shared by local, wire, and bundle fetches, including DWIM sources, destinations, tracking updates, typed rejection errors, and FETCH_HEAD policies. Round-three restores established immutable progress API signatures, but the named-remote public entry point still omits FETCH_HEAD for explicit refspecs.

  • ›grit-lib push target resolution; grit push [remote] [branch | src:dst] --dry-run4583b6e5
  • ›grit pull --rebase (pull.rebase) on the history engine93c51c20

    Adds atomic pull-with-rebase through the history rewrite engine, including config and CLI selection, structured outcomes, docs, compatibility coverage, and a daily benchmark scenario. The round-3 fix correctly replays a genuine two-line local merge without dropping either branch's content and refreshes the skill snapshot.

    pull/rebase@synth-10k median: system Git control vs reviewed Grit: 73.2 ms → 283.0 ms (74% worse)pull/rebase@synth-10k peak RSS: system Git control vs reviewed Grit: 62,193,664 bytes → 77,783,040 bytes (20% worse)
  • ›grit fetch <remote> <refspec>... with the shared FetchArgs groupecd62ff7

    Adds a shared fetch argument group and supports explicit fetch refspecs, tag/prune overrides, dry-run, quiet mode, richer per-ref status output, and rejected-update exit behavior. The library resolves fetch invocation/refspec semantics and dry-run update classification; CLI code remains focused on argument forwarding and rendering.

  • ›Shallow fetch: --depth, --deepen, --unshallow51bf91f9

    Adds typed shallow-fetch depth control across grit-lib and the `grit fetch` CLI, including relative deepen and unshallow behavior. It negotiates the correct v0/v1 and v2 wire forms, updates local shallow boundaries, reports boundary deltas in JSON, and adds compatibility and daily benchmark coverage.

    Depth-50 fetch median, system git control vs branch debug grit (10 fresh depth-1 clients): 20.2 ms → 21.2 ms (5% worse)
  • ›grit push --force-with-lease[=<rev>] and --force5d18b6b0

    Adds typed push force policy to grit-lib and exposes unconditional force and tracking/value force-with-lease in the modern CLI. Push planning carries expected-old/expect-absent checks through deletion as well as update refspecs, reports stale leases in JSON/human output, updates tracking refs after success, and adds compatibility tests and a daily benchmark scenario.

  • ›grit fetch --allbc829b6c

    Adds sequential multi-remote fetch to the library and exposes it as `grit fetch --all`. It honors config order, skipFetchAll, each remote's tag/prune settings, continues after individual failures, and returns a dedicated aggregate JSON shape with exit 1 on partial failure.

  • ›grit push -u, --atomic, -o/--push-option, --follow-tags0c9fa5d5

    Adds modern push controls for setting upstreams, atomic updates, server push options, and following reachable annotated tags. The round-4 correction makes follow-tags work for commit refspecs targeting custom namespaces and keeps JSON upstream reporting correctly present only after an upstream is actually set.

    5,000-commit up-to-date `push --follow-tags --dry-run` median (system Git baseline → reviewed grit, 40 runs): 3.2 ms → 2.4 ms (34% better)
  • ›grit pull [remote] [branch], --autostash, --check, shared FetchArgs1abc43c6

    Adds explicit remote/branch pull resolution through FETCH_HEAD, automatic dirty-worktree stashing, and a fetch-then-predict check mode without integrating. The CLI reuses shared fetch arguments and exposes stable human, JSON, and Markdown outcomes, while the daily benchmark matrix gains pull/check coverage.

    pull/fast-forward git.git wall time: origin/main grit vs branch grit: 14.0 ms → 12.9 ms (8% better)pull/check git.git wall time: system git vs branch grit: 83.4 ms → 620,614 ms (100% worse)pull/fast-forward git.git peak RSS: origin/main grit vs branch grit: 24,313,856 bytes → 24,526,848 bytes (1% worse)
  • ›grit skill and tutorial: remote workflowsa1285d1e

    Extends the embedded grit skill and user documentation with practical fetch, pull, and safe push workflows. The round-two fix commit also closes the five CLI behavior findings: mutually exclusive branch mutations, usage exit codes, zero fetch depth, ordered reverts, and dry-run sequencer safety.

roadmap · Branches, tags and upstream tracking8 steps
  • ›grit-lib: shared ref query (patterns, sort, limit)613453a1

    This change introduces a shared grit-lib reference query API for namespace filtering, short-name patterns, name/version/date sorting, reversal, limits, peeling, and in-memory remote-ref inputs. It routes tag helpers through that engine and adds public API, Git-compatibility, oracle, and benchmark coverage, but its portable version comparator is currently incorrect.

  • ›grit tag: -f, -F, positional target, --dry-run1aafaa35

    This adds force replacement, file/stdin messages, positional targets, and dry-run behavior to tag creation/deletion through a typed grit-lib API and thin CLI wiring. It also updates all output contracts, agent guidance, snapshots, and system-Git compatibility coverage.

    tag/create@many-refs median wall: system Git comparator to reviewed grit: 2.2 ms → 28.6 ms (92% worse)tag/create@many-refs peak RSS: system Git comparator to reviewed grit: 7,675,904 bytes → 21,479,424 bytes (64% worse)
  • ›grit-lib: branch create/delete/upstream with typed errors03e40206

    Adds typed, library-first branch creation, force reset, safe/forced deletion, and upstream configuration. Branch creation now validates that start objects peel to commits before touching refs, shares tracking policy with switch, and preserves Git-compatible refs, reflogs, and branch config.

  • ›grit remote refs: shared pattern, sort and limit825ea133

    Remote reference advertisements now use the shared in-memory ref query for ls-remote tail patterns, name/version sorting, reverse order, and post-sort limits. The round-2 correction preserves match-all only for an absent pattern list and makes an explicitly empty pattern return no refs, matching system git.

  • ›switch: typed would_overwrite errors and --dry-runc67f607b

    Switch overwrite refusals are now typed library errors with stable reason/path data, and switch supports a true preflight mode that resolves and checks the target without changing repository state. The CLI exposes this as long-only --dry-run and renders consistent human, JSON, and Markdown results, with schemas and agent docs updated.

    switch/branch@synth-100k grit median wall (5 alternating smoke reports): 18.5 ms → 17.4 ms (6% better)switch/branch@synth-100k grit median peak RSS (5 alternating smoke reports): 17,641,472 bytes → 18,243,584 bytes (3% worse)
  • ›grit-lib: branch inventory and upstream status (delete the stub)c3df07ae

    Adds a typed branch inventory and upstream-status API with cheap names-only and parallel full-detail modes, including worktree, commit subject/time, and ahead/behind data. Round 3 corrects full-detail subjects to match Git for whitespace-bearing and empty commit messages.

  • ›grit-lib: branch rename (ref, reflog, config, worktree HEADs)da0e3029

    Adds a library-first branch rename operation that moves the branch ref and reflog transactionally, preserves branch config, and retargets HEAD in the main and linked worktrees. It supports files, packed refs, reftable, and injected ref stores, including force, dry-run, unborn HEAD, and case-only renames.

    packed 10k-ref rename median (before=system git, after=grit-lib): 1.5 ms, 30 runs each → 36.7 ms, 30 runs each (96% worse)
  • ›grit branch: create at start, track, upstream, rename, --force-deleteef8ab4ab
roadmap · Rebase and history editing8 steps
  • ›History JSON contract: subject and ref keys958172c6

    History rewrite results now carry a first-line commit subject in every rewritten row and expose `ref` as the canonical ref-update key while retaining deprecated `name` for one release. Human and Markdown output, JSON schemas, snapshots, tests, docs, and the public API snapshot are updated together.

  • ›Library: rebase request with fork point, up-to-date detection and a bounded patch-id scan0662cbf2

    Adds a typed library rebase-planning API that finds the merge-base fork, detects no-op rebases, returns conflicts as values, and bounds cherry detection to the divergent onto-side history. The round-3 fix preserves full-patch identity while using paths only to prune candidates, and isolates the benchmark/test counter per thread.

  • ›`grit history split <commit> -- <paths>`557e9d4c

    Adds the modern `grit history split` command for peeling selected paths into a newly inserted parent commit while preserving the target tree and replaying descendants. It forwards to the existing typed grit-lib split planner, supports dry-run and all output modes, and returns the shared history rewrite outcome.

  • ›`history absorb --dry-run` shows the hunk → commit assignmente4ce9a2b

    Dry-run absorb plans now expose a stable hunk range, target commit, and target subject in human, JSON, and Markdown output. Markdown remains structurally valid when Git paths or commit subjects contain pipes, and dry-run behavior is regression-tested not to alter repository state.

  • ›`history reword --author`bdf9bd22

    Adds author rewriting to history reword while preserving the existing message-only API. Callers can change the message, author, or both; omitted author dates retain the original commit timestamp, and whitespace-only author input no longer blocks an otherwise valid message rewrite.

  • ›`--empty` and `--keep-committer` on every history subcommandd5178da4

    History rewrite flags are now consistent across drop, move, reword, fixup, squash, and absorb. Users can choose how replay-created empty commits are handled and preserve source committer lines, including on the squash fast path and absorb planning.

  • ›Library: rebase stop/resume engine (continue, skip, abort)4c131b94

    Adds a library-level resumable rebase session that preserves successfully replayed commits when a later commit conflicts. It leaves Git-compatible stop state, supports continue/skip/abort, keeps branch refs untouched until completion, and synchronizes HEAD, index, and worktree to the final rewritten tip.

  • ›`grit history undo` from a recorded ref plan88572f8a

    History rewrites now leave a versioned, atomic record of their ref movement and expose a library-first undo operation that safely reverses the latest rewrite. The CLI adds `grit history undo`, including stable JSON/Markdown data and dry-run behavior, while a second undo reapplies the original rewrite.

roadmap · Hunk selection for agents (replacing `-p`)3 steps
  • ›Blob-level patch apply engine in grit-lib/apply.rs23323300
  • ›Stable hunk ids in grit-lib and `diff --json`a2c2cc72

    Adds stable 12-hex hunk identifiers to grit-lib and exposes `id` plus zero-based `index` in staged and unstaged patch-detail JSON. The round-3 peer-side duplicate ranking keeps a later byte-identical insertion selectable after an earlier twin is staged.

    diff/worktree@synth-10k normalized grit/git ratio (pre-change parent → branch): 1.5 ratio → 1.5 ratio (1% worse)diff/worktree@synth-10k 20-run peak RSS (pre-change parent → branch): 26,292,224 bytes → 25,964,544 bytes (1% better)diff/worktree@synth-10k wall time (current origin/main → branch; unequal 3/20-run sampling): 10.9 ms → 12.5 ms (13% worse)diff/worktree@synth-10k peak RSS (current origin/main → branch; unequal 3/20-run maxima): 17,272,832 bytes → 24,035,328 bytes (28% worse)
  • ›Index-level apply and `grit add --patch-file`aea5fbab

    Adds index-only unified patch application to grit-lib and exposes it as `grit add --patch-file`, including dry-run and structured output. The follow-up commit closes the review’s compatibility gaps for newline markers, deletion preimages, SHA-256 repositories, path collisions, modes, snapshots, and lock ordering.

    patch apply median: system git baseline vs branch grit: 6.5 ms → 8.7 ms (25% worse)patch apply peak RSS: system git baseline vs branch grit: 9,756,672 bytes → 16,424,960 bytes (41% worse)
issues fixed9
  • ›Commit with an empty tree never writes the empty tree object: git fsck reports 'missing tree 4b825dc'#140188864ff9

    This makes normal and prehashed ODB writes distinguish a virtually readable empty tree from one actually stored in the repository. Empty-root commits and commits that remove every file now leave repositories that system Git can validate and clone cleanly.

  • ›diff/show: appending to a file with no trailing newline shows the old last line as unchanged context#14029ed2ebb1

    Diff alignment now treats a terminated line as distinct from identical text at EOF without a newline, so appending after an unterminated last line produces the required delete/re-add pair. Human structured output, JSON/stat derivations, and Markdown now consistently preserve the two EOF markers.

  • ›Follow-up: Fix #1399: Non-UTF-8 file names: status/diff miss changes, clone writes U+FFFD names, add fails with I/O error#139917389840

    Preserves non-UTF-8 repository paths losslessly across status, diff, staging, restore, clone, and checkout. The final review fixes ensure tracked restaging, slow checkout's up-to-date path, and gitlink untracked suppression all use raw index/OS bytes at filesystem boundaries instead of the reversible display string.

  • ›grit add <path through a symlinked dir> exits 0 with no output and stages nothing (git: fatal beyond a symbolic link)#1403bcb18b8f

    Grit now returns a typed library error when an add path crosses a symlinked directory instead of silently staging nothing. The review follow-up also covers directory-style trailing slashes and records the new error in the generated public API snapshot.

  • ›grit add/commit hang forever on a FIFO in the work tree; a unix socket aborts add with 'No such device'#140066793eaf

    Worktree scans now silently exclude FIFOs, Unix sockets, device nodes, and other non-indexable entries before status or staging can open them. Regular files continue through add and commit, with library and CLI regressions covering status parity, staging, auto-stage commit, JSON output, and Git fsck compatibility.

  • ›merge/pick/revert/history drop leave an empty subtree entry (missing 4b825dc) when a directory is emptied#1413f9807ddd

    Tree composition now removes a directory entry when recursively merging that directory produces Git's canonical empty tree. It also sanitizes an unchanged ours-side directory entry that already points at an empty tree, preventing replay and merge operations from creating commits with empty subtrees.

    220-case system-Git merge compatibility matrix: 7.5 seconds → 7.0 seconds (8% better)
  • ›push --delete --json reports "branch":"--delete" instead of the deleted ref#1414f8c0b9c6

    Push JSON now distinguishes the machine-readable branch from the human display label. A single branch deletion reports the deleted branch’s short name, while tag and multi-ref pushes omit the ambiguous field; human and Markdown text retain their prior labels.

  • ›grit clone/commit abort with 'SHA-1 hash collision detected' on repos containing shattered-1.pdf (git/git unclonable)#14158854c0d0

    Grit now accepts SHA-1 repositories and worktree content containing SHAttered test vectors instead of aborting on a raw-payload sha1dc signal. Canonical Git object ids remain byte-compatible, and fsck no longer treats this Git-accepted content as fatal.

    Real shattered-1.pdf commit median: system Git vs branch grit: 28 ms → 30 ms (7% worse)
  • ›Non-UTF-8 file names: status/diff miss changes, clone writes U+FFFD names, add fails with I/O error#1399d86342b0

    Preserves arbitrary Unix filename bytes across status, diff, add, clone, restore, and checkout additions using a reversible stored-string representation and raw-byte worktree joins. Round two also makes the reserved encoding prefix injective, moves the regression to grit-lib APIs, and fixes the prior lint/Bugbot findings, but checkout deletions remain incorrect for those encoded paths.

other changes35
  • ›Fix the v0.5.16 release build92b9f17d

    Makes the POSIX pickaxe regex adapter compile and behave safely on musl without changing the bounded glibc/BSD path. It also locks in exact-length-buffer safety and correct ^ anchoring during continuation scans.

  • ›Main keeper: make CI on main green (coverage, test-threaded, test)8e41fa72

    The branch keeps coexisting legacy `gitbutler-change-id` metadata when rewriting a commit that already has a canonical `change-id`, while still migrating legacy-only commits. It also teaches docs validation to recognize rustdoc's `tymethod.*` anchors for required trait methods; the effective tree contains and tests all three corrected conflict-rendering behaviors requested in round two.

  • ›Follow-up: tree-sha256 digest engine in grit-libaeecc293

    Adds a read-only tree SHA-256 digest API with compatibility fixtures, documentation, examples, and benchmarks, then closes the final review defects in mode handling, stale-index diff composition, and golden generation. The round-2 changes hash all regular-file mode variants and preserve one-row-per-path WorktreeVsHead behavior.

    1,776-file whole-process digest median (reference -> grit): 17.4 ms → 165.4 ms (90% worse)1,776-file reference process vs grit-lib in-process median: 17.4 ms → 4.6 ms (3.8× better)
  • ›Main keeper: make CI on main green (coverage, test-threaded, test)63352e1e

    This branch withdraws its branch-only change-id API work because the effective behavior fix already landed on main. Its resulting tree is exactly identical to origin/main, so integration would add an empty audit commit and no code.

  • ›Speed: revs/left-right-count@deep-history625a9935

    This replaces repeated one-way scans of first-parent history with one two-sided ancestry classification that can stop near the answer, then reuses that result for merge-base and left/right counting. It also validates pack-bitmap source checksums by reading only the file trailer instead of loading an entire pack or MIDX.

    left-right count time, origin/main → branch (git 2.205 ms): 252.1 ms median, 10 runs → 7.7 ms median, 10 runs (33× better)left-right count peak RSS, origin/main → branch (git 6.70 MB): 39.4 MB, 10 runs → 13.4 MB, 10 runs (2.9× better)merge-base branches time, origin/main → branch (git 15.597 ms): 175.0 ms median, 10 runs → 5.5 ms median, 10 runs (32× better)merge-base branches peak RSS, origin/main → branch (git 17.26 MB): 56.2 MB, 10 runs → 20.5 MB, 10 runs (2.7× better)
  • ›Speed: blame/file@git-git1eeea6f0

    This change makes blame skip unchanged history without retaining full commits or trees, while preserving one parsing behavior for loose and packed objects. It also avoids unnecessary tree decoding and pack inflater allocation, cutting the headline git.git blame workload from 940 ms/599 MiB to 385 ms/273 MiB in my measurements.

    git.git README blame median (system Git 295 ms): 940 ms → 385 ms (2.4× better)git.git README blame peak RSS (system Git 232.9 MiB): 599.3 MiB → 273.2 MiB (2.2× better)deep-tree blame median (system Git 390 ms): 180 ms → 120 ms (50% better)deep-tree blame peak RSS (system Git 52.7 MiB): 114.2 MiB → 56.5 MiB (2.0× better)
  • ›Main keeper: make CI on main green (test-threaded, check-windows-msvc, coverage, fmt, test)e3409952

    Repairs the Windows-only compilation paths and makes fixup compatibility tests compare like-for-like by disabling Grit change IDs in Git-oracle fixtures. The round-2 follow-up restores the history harness's monotonic timestamp contract for `commit-tree` and adds a regression test over a three-commit DAG.

  • ›Follow-up: grit-lib: fetch refspec resolution for explicit refspecs2cdace93

    Configured named remotes now populate FETCH_HEAD when fetched with an explicit refspec through `Remote::fetch`. The default source label comes from the effective fetch URL, and caller-supplied labels remain unchanged.

  • ›Follow-up: commit --dry-run and JSON files6491cea1

    Adds non-mutating commit previews with stable JSON file/parent/author/hook fields, path-scoped and staged commit support, and documented human/JSON/Markdown behavior. The review follow-ups restore Markdown change IDs and harden staging paths, but the post-commit hook still receives the temporary partial-commit index.

  • ›Speed: log/all@git-gitc78aa9c9

    Default-order bounded rev walks now stream until the requested page is full at any limit, instead of walking and sorting the entire reachable history above 4096 commits. The walk can also retain parsed commit data for the log renderer, eliminating a second object read/inflate while preserving Git order.

    log/all time (system Git 44.914 ms): 751.5 ms median, 10 runs → 67.8 ms median, 10 runs (11× better)log/all peak RSS (system Git 17.38 MiB): 121.8 MiB median, 10 runs → 37.3 MiB median, 10 runs (3.3× better)log/oneline-100 time (system Git 2.695 ms): 4.5 ms median, 10 runs → 4.5 ms median, 10 runs (1% worse)log/oneline-100 peak RSS (system Git 13.37 MiB): 21.0 MiB median, 10 runs → 20.3 MiB median, 10 runs (3% better)
  • ›Main keeper: make CI on main green (coverage, test-threaded, check-windows-msvc, public-api, test, rustdoc)2df92370

    Repairs the CI-specific breakages around tag test construction, strict rustdoc, and the canonical module-layout guard. It also corrects pull command documentation/schema and uses the supported explicit v2 installer form for cargo-llvm-cov.

  • ›Follow-up: grit-lib: shared ref query (patterns, sort, limit)17364c02

    This adds a reusable ref-query engine for namespace filtering, patterns, name/version/date sorting, limits, and peeled targets, then routes tag listing through it. The review follow-up fixes empty prerelease suffix ordering, symbolic-ref peel leakage, and dangling-object date sorting, with direct system-Git compatibility coverage.

    100k packed-ref version-sort median (system Git → grit branch): 56.3 ms → 121.0 ms (54% worse)
  • ›Follow-up: Tag verification API: signature plus recomputed digestf37100ed

    Nested submodule hashing now preserves a missing checkout’s already top-level-qualified path while unwinding recursion. A missing leaf under inner/mid is therefore reported as inner/mid/leaf through both tree_sha256 and signed-tag verification, instead of duplicating ancestor prefixes.

  • ›Quality #13: Move logic into grit-lib78a26690

    Pull planning and integration now live in grit-lib, including fetch-refspec-aware upstream resolution, local-remote handling, unborn-branch adoption, compare-and-swap ref updates, and typed outcomes/errors. The CLI is reduced to plan, fetch, integrate, and render, and failed post-update reflog appends are surfaced as warnings without falsely reporting a failed pull.

    pull/fast-forward@git-git grit median wall time: 22.0 ms → 22.1 ms (1% worse)pull/fast-forward@git-git grit peak RSS: 27,955,200 bytes → 28,270,592 bytes (1% worse)
  • ›Follow-up: commit P1: --date, --trailer, -s, --reset-author, -C, -S/--no-gpg-sign7f24b0d8

    Adds modern commit controls for dates, trailers/signoff, author reset, message reuse, and signing overrides through a library-first API with thin CLI wiring. The final compatibility fix prevents malformed timezone text from reaching commit objects, while preserving canonical numeric offsets and normalizing Git-compatible raw dates.

  • ›Follow-up: grit-lib push target resolution; grit push [remote] [branch | src:dst] --dry-run74b63dd5

    This adds a typed library-level push planning layer and keeps the CLI as a renderer/transport caller. The final fixes make configured exclusions independent of config order, preserve Git-compatible matching behavior, correctly classify literal remotes, and restore the CLI architecture guard.

  • ›Quality #14: Deduplicatef7dee3ab

    This consolidates every core.logAllRefUpdates value interpretation into one grit-lib parser and routes files/reftable decisions through it. It removes two hand-written config scanners, fixes reftable handling of standard boolean spellings, and adds six focused tests.

    branch/create@many-refs grit median: 30.7 ms (20 runs; system git 2.214/2.204 ms) → 30.0 ms (20 runs; system git 2.214/2.204 ms) (2% better)branch/delete@many-refs grit median: 9.7 ms (20 runs; system git 4.502/4.514 ms) → 9.7 ms (20 runs; system git 4.502/4.514 ms) (0% better)
  • ›Quality #15: Simplifya1f952a2

    This change removes obsolete identity helpers that survived the deleted compatibility CLI and folds the loose committer name/email resolution into one direct, documented chain. Production identity code shrinks while preserving strict and best-effort fallback behavior; focused tests pin the subtle empty-variable and user.useConfigOnly cases.

    commit-10000 grit median: 171.0 ms → 154.2 ms (11% better)switch-10000 grit median: 19.3 ms → 18.9 ms (2% better)switch-wide-10000 grit median: 44.3 ms → 44.7 ms (1% worse)
  • ›Speed: status/clean@synth-10kd8ab7639

    This change removes avoidable allocation and sorting costs from status scans, and splits untracked traversal below a single top-level directory so workers stay busy on common synthetic and real layouts. It adds serial/system-git oracle coverage and documents the parallel traversal; round 2 removes five accidentally committed insta scratch files without changing the approved code.

    status/clean@synth-10k median (system git after: 8.746 ms): 19.0 ms → 12.7 ms (49% better)status/dirty@synth-10k median (system git after: 12.416 ms): 19.2 ms → 12.4 ms (55% better)status/clean@synth-100k median (system git after: 66.141 ms): 160.4 ms → 72.7 ms (2.2× better)status/dirty@synth-100k median (system git after: 104.150 ms): 171.2 ms → 77.0 ms (2.2× better)
  • ›Main keeper: make CI on main green (bench-daily-smoke, test-threaded, scripts, test, rustdoc, coverage)5d18b6b0

    Restores the missing daily benchmark scenario registrations and fixes CI-facing docs/rustdoc checks. It also makes commit dry-run build a correct in-memory index with real blob IDs, rejects CR/LF author injection, and keeps add dry-run list-only.

  • ›Follow-up: grit branch: create at start, track, upstream, rename, --force-delete6f243007

    Corrects branch mutation dispatch so a leading positional branch is the rename source and local tracking previews use the same canonical upstream name as live creation. It also closes remaining incompatible delete-flag paths without changing repository formats or public signatures.

  • ›Follow-up: Library: pick/revert sequence engine that stops on conflictbd3775be

    Adds the library-first pick/revert sequence engine, Git-compatible sequencer state, conflict stop/continue/skip/abort behavior, no-commit and empty policies, structured created-commit records, status guidance, public API documentation, and an executable conflict guide. The latest fix moves the empty resolved-tree validation ahead of step-head/todo mutation so a failed continue retains the current sequence entry.

  • ›Speed: pick/one@synth-10k95af83e8

    This replaces repeated linear sparse-path scans with a prefix index, shares parsed trees, and avoids rebuilding and writing the checkout index twice. It also trusts an already-collected clean lstat in the dense worktree diff path, cutting pick and revert dramatically while preserving Git-readable trees and indexes.

    pick 10k median: 195.9 ms → 58.3 ms (3.4× better)pick 100k median: 2,898 ms → 199.1 ms (15× better)pick 10k ratio vs system Git: 1.6 ratio → 0.513 ratio (3.1× better)pick 100k ratio vs system Git: 7.8 ratio → 0.984 ratio (7.9× better)
  • ›Follow-up: grit revert: several commits, ranges, --mainline, --continue/--abort/--skipcb1f717a

    Conflict continuation for `grit revert --no-commit` now advances the sequence without writing a commit, preserving the branch tip while keeping the resolved index. The broader branch adds multi-commit/range revert sequencing, mainline handling, stop/continue/abort/skip, modern CLI output, docs, and Git interoperability coverage.

    synth-10k single-revert median: origin/main to branch: 52.2 ms → 51.5 ms (1% better)synth-10k single-revert median: system git to branch: 32.1 ms → 51.5 ms (38% worse)
  • ›Speed: branch/create@many-refs544d7f87

    Ref creation now avoids materializing every ref and reflog when checking namespace conflicts, indexes large packed-refs through a mapped view, and reuses the repository's ref/config state. The round-2 addition makes the final under-lock create check authoritative even if packed-refs is atomically replaced without an observable length/mtime change.

    branch/create median (system Git after control: 2.214 ms): 34.4 ms → 3.3 ms (10× better)branch/create peak RSS (system Git after control: 7.848 MB): 22.8 MB → 13.9 MB (64% better)branch/delete median (system Git after control: 4.468 ms): 10.9 ms → 10.8 ms (1% better)branch/list packed median (system Git after control: 2.212 ms): 3.3 ms → 3.3 ms (1% better)
  • ›Main keeper: make CI on main green (clippy, coverage, scripts, test-threaded, test, rustdoc)31aa4acb

    Repairs the CI-specific clippy, rustdoc, canonical-module, snapshot/JSON-contract, and revert-validation failures without changing on-disk or wire formats. The round-3 amendment makes the revert prevalidation closure rustfmt-clean while retaining the regression that proves a mixed commit/tree input cannot partially mutate a repository.

  • ›Main keeper: make CI on main green (test-threaded, scripts, test, coverage)a4e5e073

    This change makes the SHA abstraction coverage guard distinguish actual `Sha256::` paths from longer identifiers such as `TreeSha256::`. It also caps Cargo build/link concurrency at one for coverage, normal workspace tests, and release threaded tests to avoid the observed lld signal-7 bus errors.

  • ›Investigate implausibly fast fetch/pull/push benchmarks3b1c4bae

    This hardens daily remote benchmarks so successful timing means the command actually changed the expected repository state. Push preparation now generates fresh commit IDs on every cycle, and transport-aware checks prove file and HTTP targets did not have the tip before timing and do have it afterward.

    fetch git smoke median: 89.5 ms → 103.1 ms (13% worse)fetch grit smoke median: 8.7 ms → 12.0 ms (28% worse)pull git smoke median: 107.1 ms → 106.4 ms (1% better)pull grit smoke median: 15.3 ms → 16.2 ms (5% worse)
  • ›Quality #16: Library API qualitya97975d2

    This change gives reftable parsing, stack locking, and compare-and-swap rejection a structured public error model instead of overloaded `InvalidRef`/`Message` strings. The reftable ref-store boundary now maps lock and CAS errors by type, and decoder error construction is kept off hot paths.

    List 100k reftable refs (Criterion median): 8.4 ms → 8.4 ms (0% worse)Create 10k refs transaction (Criterion median): 1.9 s → 1.9 s (1% better)
  • ›Main keeper: make CI on main green (test-threaded, coverage, test)215e1b83

    Adds an executable CI helper that removes large, unused hosted-runner SDK/tool caches and prunes Docker images. Coverage, workspace test, and release-threaded test jobs invoke it immediately after checkout, before their large Rust builds.

  • ›Perf regression 2026-10-21: show/head@git-git, bundle/create@synth-10k, diff/staged@deep-tree +8443409a0

    This branch repairs the 2026-10-21 performance and correctness regressions across show/log decoration lookup, bundle object walking, staged/worktree diff construction, gc/repack, commit-graph memory, SHA-1 collision handling, and daily worktree setup. The round-3 amendment restores fast standalone prune validation by checking packed blob IDs against pack indexes loaded once, while retaining missing-object and non-canonical tree-mode correctness.

    standalone prune median, synth-10k + 40 loose commits (20 runs): 218.7 ms → 211.0 ms (4% better)standalone prune median peak RSS (10 runs): 42.5 MB → 41.0 MB (4% better)
  • ›Main keeper: make CI on main green (test, coverage)0605d904

    This branch repairs fetch refspec planning so negative refspecs are honored and vanished explicit refs can be pruned. The round-2 changes additionally map short explicit fetches to configured tracking destinations and preserve missing HEAD as the symbolic ref, while CI selects GNU bfd for large test links.

  • ›Follow-up: Blob-level patch apply engine in grit-lib/apply.rsc41534f1

    Adds a public blob-level unified-diff application engine to grit-lib, including reverse application, offset/context search, no-newline handling, overlap protection, and typed failures. The follow-up makes zero-context duplicate-line hunks apply at their header location instead of being incorrectly pinned to EOF, while preserving EOF behavior for contextual hunks.

  • ›Main keeper: make CI on main green (test, coverage)c41534f1

    This keeper branch is empty because the reported fetch failures were fixed on main before the author finished. Both regression scenarios now pass on the reviewed tip and current main, so integrating this branch is a no-op.

  • ›Quality #17: Move logic into grit-lib9590e052

    Moves remote discovery, validation, add/config writes, remote argument resolution, peeled-ref folding, and fetch outcome classification into grit-lib, leaving grit-cli primarily responsible for rendering. The round-2 amendments ensure linked-worktree remote configuration matches Git and URL-less remote sections are classified consistently.

    grit fetch origin median, main→branch: 2.5 ms → 2.5 ms (0% better)grit fetch origin main median, main→branch: 2.6 ms → 2.7 ms (1% worse)grit remote median, main→branch: 2.1 ms → 2.0 ms (4% better)fetch origin median, system Git→branch grit: 5.8 ms → 2.5 ms (2.4× better)
$ git log --oneline d4844e92..v0.5.17compare on GitHub ↗
3b1c4baefix(grit-bench): harden remote daily fetch/pull/push benchmarks
a4e5e073ci: serialize workspace test links to avoid lld bus errors
098ab347test: avoid TreeSha256 false positives in hash guard
8aac80f9fix(cli): remove duplicated revert module and keep argv order
a1285d1efix(cli): address review on branch, fetch depth, and revert order
96b88578docs: extend grit skill and tutorial for remote workflows
31aa4acbMerge branch 'factory/ci-green-3209'
63d6ee1dfix: remove duplicate operation key in canonical-modules.toml
cf804cf1fix: validate every grit revert revision as a commit
c191c375test: refresh skill and revert CLI snapshots
544d7f87refs: recheck packed-refs freshly before creating refs
7f23ee8ebench: record branch and tag daily rows on many-refs before and after
0fb1774erefs: map large packed-refs files instead of copying them
f84f544drefs: create refs without loading every ref and reflog
1abc43c6fix(pull): drop operation autostash after conflict-free abort restore
30174911fix(pull): review — autostash on errors, dry-run, path remotes, branch API
3a988dc3feat(pull): explicit refspecs, --autostash, --check, and shared fetch flags
cb1f717aMerge branch 'factory/revert-no-commit-3187'
0c9fa5d5Refresh CLI skill output snapshots after main rebase
33aa49eeUpdate grit-lib public-api snapshot for push flags
31cca925Sync json_output tests with commit and merge JSON shapes
af279e02Fix follow-tags for custom ref destinations and restore push planner
e56a2096Follow-tags: commit-graph ancestor checks instead of full walk
75bee3eaAddress push review: upstream JSON, follow-tags, push-options
ca925282Add grit push -u, --atomic, push options, and --follow-tags
027c55c1feat: wire grit pick --continue, --abort, and --skip
d7b5138cfix: replay sequence start state, continue ordering, and mainline messages
e553775ffix: preserve HEAD when continuing a no-commit revert sequence
91acca93Address revert review: revision range order and replay created records
bc829b6cMerge branch 'factory/fetch-all-3010'
bd3775beMerge branch 'factory/pick-revert-status-3189'
f4ed9de8test(fetch): refresh fetch_prune snapshot for prune output
9092c4fffix(fetch): address Bugbot CLI refspec and dry-run findings
5a71f1ecfeat(fetch): add --all and RepositoryRemotes::fetch_all
6f243007fix(branch): rename positional OLD, upstream preview, and flag guards
4f9ea23freplay: check empty continue before advancing sequencer
37586244replay: Grit merge-revert wording and continue fixes
ec3e6effstatus: expose pick/revert operation hints for Git sequencer state
95af83e8Merge branch 'factory/perf-pick-one'
89f1ea8dMerge branch 'factory/ci-green-3128'
5d18b6b0fix: daily headline roadmap table length and push_plan rustdoc
c250d139fix: apply force-with-lease to delete ref updates
301fe03egrit push: force-with-lease and --force in push planner and CLI
d8ab7639Merge branch 'factory/status-clean-speed'
ed8da7d4test: raise root pub mod budget for new grit-lib modules
781931edfix: reject embedded newlines in --author values
d2260327fix: commit dry-run staging uses real blob oids
0daa61cafix: add module doctests for operation and repo_relpath
06b90442fix: restore daily scenario registry entries and CI doc checks
51bf91f9fix: drop unused mut in fetch_deepen daemon helper
c9721a5cfix(fetch): deepen-relative framing and review follow-ups
88feeeb0docs: update public API snapshot for FetchDepth
9d8d6ce6feat(fetch): shallow depth, deepen, and unshallow
0b21618cstatus: reset the walk's ignore matcher per directory task
d8438165docs: describe how the status untracked walk is parallelized
33bd9835status: test the split untracked walk
d4302ba8worktree scans: fewer allocations and cheaper sorts
b70a6309status: split the untracked walk below the top level
dfc39288status: cut per-entry allocations in the worktree scans
80df2cbabench: restore status/paths and status/renamed matrix registrations
b680361ftests: rustfmt the wide-pick replay tests
77e1f269docs: record the pick/revert/merge apply-path speedup and refresh hot-paths baseline
c0022741diff: trust the scan's lstat for clean entries in the dense worktree pass
8b1d8f36pick/revert: write the merge checkout index once, keeping fresh stat rows
48bdb090merge_trees: index touched and sparse paths by prefix instead of scanning them
f2f316c6Merge branch 'factory/revert-sequence-3025'
ecd62ff7Merge branch 'factory/fetch-fetchargs-3008'
ef8ab4abMerge branch 'factory/branch-mutation-3001'
114bbcf6chore: fmt remotes imports; sync public-api.txt
1d45127bfix(fetch): scp remote DWIM, rejected output, restore pull docs from main
ce80f4cefix(fetch): dry-run classify via quarantine ODB; update prune snapshot
1a5dc526fix(fetch): review — tag dest rules, dry-run, trailing flags, tests
2916c8dbfix(gate): daily fetch matrix, rejected-fetch tests, and layout map
74f56b73fix(rustdoc): repair intra-doc links blocking workspace doc
b023363dfeat(fetch): shared FetchArgs, refspec CLI, and fetch JSON v1 fields
7c5501b6Address revert review: topo range order, ReplayCreated, Grit merge messages
79289039grit revert: multi-commit sequences, mainline, and continue/abort/skip
73fcc033cargo fmt
218119a0public-api: WtStatusState.grit_replay_sequencer field
48bb8bd1replay_sequence: abort-safety, no-commit empty compare, status hints
37c9e6f1Fix guide_replay_conflicts clippy; document commit JSON change_id field
684a526freplay_sequence: ReplayCreated records and maintainer steering
e80f51bagrit-lib: fix replay sequence abort, no-commit, and git opts
13bf6b97docs: fix rustdoc, pull schema docs, and module doctests for gate
f35fda9cgrit-examples: use public index handle in replay conflicts guide
f6ebf412grit-lib: pick/revert sequence engine that stops on conflict
24ec6b93fix(branch): usage JSON for delete --force, restore upstream API
4699f7bcfix(branch): review — force-delete usage, -M args, upstream dry-run validation
c8491e71feat(branch): create at start, track, upstream, rename, and force-delete
93c51c20fix(pull): replay parallel merge roots onto rebased mainline
61027aa2fix(pull): rebase merge side branches and daily pull/rebase verify
925fdd16feat(pull): rebase integration via history engine and pull --rebase
98edf6c4Add grit tag --verify CLI
4583b6e5Update grit-lib public-api snapshot for push plan API
551c0deeApply configured negative push refspecs as exclusions on the plan
0fdbfb28Fix push review blockers: JSON fields, remote DWIM, matching refspec, src
7a415cdeFix push command doc JSON field table for schema CI
f9419c91Sync push JSON schema with schemars output
6d072ec2Add grit-lib push plan and grit push refspecs with dry-run
a1f952a2ident_resolve: drop test-only identity helpers and fold the loose committer chain
f7dee3abMerge branch 'factory/log-refs-config-dedupe'
da0e3029Merge branch 'factory/branch-rename-2999'
74b63dd5Merge branch 'factory/push-plan-3080'
61025f1fAlign push command JSON field table with PushOutcome schema
ab29913eRoute branch-rename HEAD retarget through repository RefStore
bd8568f9Address branch-rename review: atomic reflog txn, validation order, case-only refs
945cb3degrit-lib: branch rename with ref transaction, config, and worktree HEADs
1493b647refs: parse core.logAllRefUpdates in one place
67039e2cSync push JSON schema and PushRefSpec src_ref test fixtures
799a33a0Wire push plan into main after rebase
57a36012Rename push CLI helper to satisfy transport hygiene guard
6cfec790Fix push matching default, literal remotes, and config refspec mapping
eb77aa24Update grit-lib public-api.txt for push_plan surface
222c8cfbfix(merge-check): check UX, benchmark git argv, baseline, rebase gate prep
dc4391f2fix(merge-check): benchmark git shell quoting, lib driver, review blockers
97f8671afeat(merge): add in-memory merge --check prediction
28909204fix(merge): review — branch/continue conflict, label before finish, snapshots
f1645a5ffeat(cli): grit merge --continue with docs and status hints
b218a7b0feat(merge): add continue_merge to finish in-progress merges
c3df07aegrit-lib: restore branch inventory bench and coverage hooks
fec7ee01grit-lib: match Git subject whitespace and empty messages
4f993763grit-lib: fix branch inventory upstream, subject, and Names sort
7f24b0d8Merge branch 'factory/commit-p1-date-tz-3079'
78a26690merge: restore integration outcome mapping after rebase
7f0fbe6epull: preserve main API while applying integration fixes
c4945b41pull: resolve and integrate the upstream in grit-lib
c0fcfcc3merge: compare-and-swap the branch move through the ref store
3e923e46branch_tracking: map the upstream through the remote's fetch refspecs
d7f6a9a1commit: normalize --date timezone suffixes like Git
aacd9991commit: P1 flags (--date, --trailer, signoff, -C, signing)
fd564ef3Use canonical config::ident import in grit commit CLI
706a9303Add canonical map entries and regenerate public-api snapshot
af48b220Fix commit review blockers: message stripspace, post-commit, author parse, amend author
ed506101commit: message file, author override, and no-verify hooks
f37100edtree_sha256: do not double-qualify nested missing submodule paths
17364c02Merge branch 'factory/version-sort-fix-3069'
2df92370Merge branch 'factory/ci-green-3085'
056cccfcfix: rebase integration after origin/main
7ba2affdchore: refresh dashboard baselines at branch HEAD
8298dcb1fix: path-scoped commit dry-run preview and CLI review items
fdb97b86Polish: dry-run staging, hostile path validation, docs, schemas, baselines
9a206645Workflow test, commit/add dry-run stack, and skill docs
94287658fix: add dry-run without ODB writes and pathless -u unmerged resolution
40a801a5add: -u/--update, --dry-run, and path lists in stage outcome
bb840e92fix(ci): restore main CI (tag tests, rustdoc, pull docs, coverage install)
3a9cf276grit-lib: fix version:refname sort and ref query edge cases
c78aa9c9Merge branch 'factory/perf-log-all'
6491cea1Merge branch 'factory/commit-dry-run-3068'
c67f607bMerge branch 'factory/switch-dry-run-overwrite-3cb0'
4b8f01baMove commit parents into the walk cache unless retaining
d0db4c72docs: rev-list early stop at any limit and retain_commit_data
00d78e35Reuse the walk's parsed commits when rendering grit log
fb33b6a9Stream default-order --max-count walks at any limit
07c964c1fix(grit-cli): restore markdown change-id output for history operations
6ce589d0switch: typed WouldOverwrite errors and --dry-run
825ea133Merge branch 'factory/remote-refs-query-662d'
cdbb5cc6Update grit-lib public API snapshot for remote ref query
c3268334remote refs: empty ls-remote pattern matches nothing
e977d58bremote refs: shared ls-remote query sort, patterns, and limit
2cdace93Merge branch 'factory/fetch-named-fetch-head-fb09'
03e40206Merge branch 'factory/branch-mutation-typed-errors'
04ef8877commit: P1 flags on origin/main without #2810
e122decfdocs: clarify fetch_source is set by Remote::fetch
0f65cf2efix: set fetch_source for named Remote explicit fetches
62b4be92grit-lib: branch create/delete/upstream with typed BranchError
65b10002Merge branch 'factory/fetch-refspec-resolution-3007'
29a34bbcUpdate grit-lib public API snapshot after main rebase
a9b1672fRestore immutable FetchOptions on public fetch progress APIs
7d26d812Address fetch refspec review: mixed refspecs, HEAD/OID, FETCH_HEAD, HTTP tests
ccf3f5cbUpdate grit-lib public API snapshot for fetch refspec types.
f3a5b45fgrit-lib: typed fetch refspec resolution for explicit refspecs
e3409952Merge branch 'factory/ci-green-3046'
c6a7e0f4Address review: preserve merge/pull v1 schemas and fix skill snapshot
cb9a92f9Add shared operation conflict model and merge JSON v2
1eeea6f0Merge branch 'factory/blame-walk-speed'
bbb77e69fix: advance harness clock for commit-tree in DAG builder
19d1dffcfix: Windows lone-blob scan types and fixup git history oracle parity
1aafaa35tag: force, message file, positional target, and dry-run
613453a1Merge branch 'factory/ref-query-listing'
c65e78f8docs: describe how blame skips unchanged history
199d72b2blame: walk first parents without retaining trees or full commits
ef6bc84dobjects: stop tree entry lookup at the entry's sorted position
3a133abfpack: create the single-pack reader's inflater on first use
eeaacdd2grit-lib: add shared ref query listing (sort, patterns, limit)
625a9935pack-bitmap: read only the pack trailer when validating a bitmap
bab71c71revwalk: classify first-parent ancestry with one two-sided walk
1fcd1d90fix(pull): do not implicit-upstream when merge config unset only
6220b901fix(pull): pull.ff=false, upstream default, schema and docs
0e32ed07feat(pull): lib pull engine with ff-only and pull.ff config
e92a7408chore: refresh public-api snapshot after rebase onto main
70dbdf04fix(restore): match git --merge for add/add and binary conflicts
93270aabdocs(public-api): record restore conflict error variants in prelude
4439cd9dfeat(restore): add --ours, --theirs, --merge, and --conflict for unmerged paths
b9629421bench: hash-after baselines and hashing performance docs
5c56effetest: expect intent_to_add in add JSON schema keys
acc87b98fix: adapt intent-to-add empty blob to hash_object Result API
44185633fix: include intent-to-add paths in add --markdown output
2fab782efix: intent-to-add empty blob uses repository hash algorithm
eb221f51add: -N/--intent-to-add and -f/--force for staging
e2770e17Merge branch 'factory/tree-sha256-tag-claim'
63352e1echore: withdraw redundant change-id API; fix already on main
60805b45Merge branch 'factory/add-update-dry-run-2807'
d86342b0chore: rustfmt hash_collision_cli after hash_object API change
28721db5fix: pathless add -u removes unmerged paths deleted in worktree
5cabda2dfix: add dry-run without ODB writes and pathless -u unmerged resolution
ff8d7967add: -u/--update, --dry-run, and path lists in stage outcome
092d27edchore: map repo_relpath in canonical-modules.toml
06a29b24chore: refresh grit-lib public-api snapshot for quote_c_style_bytes
1552a760Add tree-sha256 tag header codec in grit-lib
93562c5dtest: fsck --strict for sha1Collision CLI exit code
b556f9bfMerge origin/main into factory/checked-object-hash-2718
47ce4a53fix: rebase fallout for fallible hash_object API
b6ea6d62bench: use repacked pack for hash index-pack scenario
296727d6hash: propagate HashCollision through copy detection and thin-pack fix
8f7e831ehash: make object-id hashing fallible and collision-checked
8854c0d0Fix SHA-1 ingestion for SHAttered blobs (Git-compatible object ids)
f9807dddMerge branch 'factory/empty-subtree-1413'
f8c0b9c6Fix push --delete --json reporting branch as --delete
11704815Fixes #1413: omit empty subdirectory entries from merged trees
66793eaftest: move add FIFO CLI regression to grit-cli and fix JSON field
f23ea014fix: skip FIFOs and sockets in untracked scan and add
aeecc293fix: hash all regular-file modes and unify stale-cache worktree diff
5c8b7904fix: pass --repo to tree-sha256 in golden generator
bcb18b8fReview: public-api snapshot and trailing-slash symlink pathspecs
c0f398a5Fixes #1403: reject pathspecs beyond symlink directories
44b47eedAdd tree-sha256 content digest in grit-lib
88864ff9Fixes #1401: materialize empty tree on commit write path
17389840Merge branch 'factory/non-utf8-gitlink-checkout-2963'
9ed2ebb1Merge branch 'factory/diff-no-newline-eof-1402'
be53380bfix: Bugbot non-UTF-8 path regressions in checkout, status, and restage
f6ea5b9ffix: decode stored paths for non-UTF-8 gitlink checkout additions
24d093bfFix non-UTF-8 checkout deletions in checkout_between_trees
049a4a91Fix review blockers for non-UTF-8 paths (injective encoding, restore, tests)
4bc882ccFix non-UTF-8 path handling in status, diff, add, and clone
8e41fa72fix: resolve rustdoc trait method links in site check
6211211bfix: keep gitbutler-change-id when canonical change-id exists
f7f0465fEmit markdown EOF markers and fix -w line compare keys
711dc7b3Fix diff alignment when appending to a file without trailing newline
ebbb16fcMerge branch 'cursor/commit-dry-run-steering-19cd'
8a9f0e2atest: set CreateTagRequest force and dry_run after tag API rebase
955c708btree_sha256: accumulate global prefix for deep submodule exclusions
62e6c1b1Fix nested tree-sha256 exclusions, public-api snapshot, and review fixtures
203038e0tree_sha256: add tag verification API with concurrent signature and digest checks
4749fe26fix(grit-lib): commit dry-run auto-stage and rebase parity with main
3383969bfix: restore main add staging checks after dry-run rebase
66a249b8chore(grit-lib): refresh public-api for commit dry-run API
c886ca96bench(grit-utils): register commit/dry-run daily scenario
efec5393test(grit-cli): commit dry-run JSON contract and CLI coverage
f4ab51adfeat(grit-lib, grit-cli): commit dry-run without disk writes