Releases: gitbutlerapp/grit
v0.3.99
v0.3.99 — what changed since v0.3.94
A very large compatibility & refactoring release: 710 commits, ~175k insertions across 1,823 files. The focus was (1) extracting grit's core into a reusable library, and (2) closing hundreds of behavioral gaps against upstream git (validated against git 2.52.0).
Highlights
grit_lib — library-ification
The bulk of grit's plumbing and porcelain logic was extracted out of the CLI into a reusable grit_lib crate, with domain views (object_store, references, worktree_index, revision, diffing, merging, configuration) and a porcelain/plumbing/prelude layout. Cores extracted this release include: status, blame, diff, apply, am, notes, pathspec, stash, checkout, log, merge, rebase, cherry-pick, revert, tag, and format-patch.
New examples
Added a grit examples crate with simple example binaries showing how to drive grit_lib directly.
Test-tool scaffolding is now gated behind a default-on test-tools feature.
Compatibility fixes (467 fixes across 215+ test areas)
Hundreds of behavioral fixes to match upstream git exactly. Notable areas:
- Interactive add /
add -p/add -i— colorized hunks +diff.diffFilter, no-newline-at-EOF preservation,-U/--inter-hunk-contextin reset/commit/stash-p, hunk-edit via the git editor, width-2 file numbering, wildcard/at-any-depth pathspecs. - Rebase (interactive,
--root,--rebase-merges, fixup/squash) —--execweaving, autosquash rearrange, fixup-Csquash-section handling, merge-commit parent preservation, reflog old-value correctness, abbreviate-commands. - rev-parse —
@{push}via push refspecs,^{/!...}search,--symbolic-full-name/--bisectordering. - Config / repo-format — unsupported repo-version warn/fail, split-index shared-index writes, dedup of
GIT_INDEX_VERSIONwarnings. - Reftable — single-transaction worktree branch ref+reflog writes,
GIT_TEST_DEFAULT_REF_FORMATprecedence. - Sparse-checkout, clone (template dirs, intact-repo-on-failure), filter-branch, hash-object
--path, editor fallbacks, status/porcelain-v2, cherry-pick/revert sequencer state, and more.
Test suite
27 upstream test files ported for portability (BSD wc/head, TERM=dumb, cwd-leak fixes, etc.), plus dashboard/baseline refreshes — all differentially verified against git 2.52.0.
Merged PRs
Full Changelog: v0.3.94...v0.3.99
v0.3.94
grit v0.3.0
grit v0.3.0
A massive correctness release: 845 commits since v0.2.1, driving compatibility with upstream Git's test suite from 53.6% to 93.4% of subtests passing.
Git test-suite compatibility
| v0.2.1 | v0.3.0 | |
|---|---|---|
| Subtests passing | 22,417 / 41,831 (53.6%) | 39,430 / 42,220 (93.4%) |
| Fully passing test files | 437 | 1,150 / 1,372 |
Highlights
Rebase (t34xx) — completed the rebase mega-family: --skip, merge backend, --update-refs (including worktree handling), quiet mode, malformed-todo handling, and abort/continue flows.
Diff & log (t4xxx) — true combined diffs (-c/--cc with @@@ hunks), --combined-all-paths with per-parent rename detection, word diff (--word-diff, POSIX word regexes), whitespace error highlighting (--ws-error-highlight), rename detection fixes (--no-abbrev raw format, same-path exact-rename suppression), diff-files unmerged-stage diffs and diffstat Unmerged lines, diff-tree --root --check, and reading .gitattributes from the index in bare/worktree-less repos.
Merge (t6xxx) — recursive-merge corner cases: rename/rename (1→2) content merges, directory/file conflicts (virtual D/F bases, relocated rename destinations, symmetric conflicts), nested virtual merge-base conflict preservation, criss-cross submodule conflicts, and fork-point cherry-pick filtering.
Plumbing & porcelain — ls-files --format placeholders, -k (killed), and submodule-aware -m; update-index --chmod no longer touches the worktree; apply -b, --ignore-space-at-eol, --ignore-cr-at-eol; add -p now honors -U/--inter-hunk-context/diff.context, renders additions like Git, and reports "Only binary files changed."; explicit divergent-pull exit codes; partial directory-pathspec deletes.
Other
- New root
Makefilewrapping cargo and test-harness workflows - Hundreds of additional fixes across revision walking (t1xxx), transport/pack (t5xxx), submodules (t7xxx), blame/annotate (t8xxx), and fast-import/export (t9xxx)
Full changelog: v0.2.1...v0.3.0
What's Changed
- docs: verify t8 test family fully passing (105/105) by @schacon in #777
- fix: make t7800-difftool fully pass (95/95) by @schacon in #776
- T9 family tests passing by @schacon in #778
- T1 tests passing by @schacon in #779
- T2 family test passing by @schacon in #780
- fix(clean): make t7300-clean fully pass by preserving harness config and surfacing unreadable-dir failures by @schacon in #782
- fix: t7600/t7601/t7611 merge tests fully pass by @schacon in #781
- fix: t7 family test improvements (t7418, t7505 rebase hooks) by @schacon in #784
- T1 tests passing by @schacon in #785
- Add grit-http-server PoC and fix upload-pack ref advertisement by @schacon in #783
- fix: materialize empty tree in unpack-objects (t5300-unpack-objects 2… by @schacon in #786
- T5 tests passing by @schacon in #788
- T3 tests passing by @schacon in #787
Full Changelog: v0.2.1...v0.3.0
v0.2.1
A small follow-up to v0.2.0.
What's new
grit update — self-update
A new grit-specific command that updates grit to the latest release:
grit update # upgrade the running install in place
grit update --dir DIR # install into a specific directory
It runs the official installer at https://grit-scm.com/install (so platform detection
and asset naming stay single-sourced), defaulting INSTALL_DIR to the directory of the
running grit binary. Requires sh and curl.
grit -v shows the grit version
git version output now includes the grit crate version:
git version 2.47.0.grit-0.2.1
applied consistently to -v / --version / version / version --build-options,
and the bugreport / diagnose reports.
Full Changelog: v0.2.0...v0.2.1
Full Changelog: v0.2.0...v0.2.1
v0.2.0
Grit v0.2.0 is a large feature release — 321 commits since v0.1.6 — extending the
grit-lib engine and the grit CLI to cover most commonly-used, non-interactive Git
workflows. Each area below is validated against the upstream Git test suite (tests/).
Highlights
🔏 Signing (GPG + SSH) — new
- New
grit-lib/src/signing.rsandpush_cert.rs(from scratch). commit -S/commit.gpgsign, annotatedtag -s/-u,verify-commit,verify-tag.log/rev-list%G?/%GS/%GK/… andshow --show-signature.push --signedwith HMAC nonce +GIT_PUSH_CERT*env.- Verify chooses format from the signature armor (SSH commits verify even with
gpg.formatunset). - Harness:
t751028/28,t752826/29,t703114/14,t553413/13.
🌓 Sparse checkout
- Cone + non-cone pattern load/save, sparse-directory index entries,
read-tree/checkout materialization. add/rm/mv/statusrespect the sparse specification.- Harness:
t109176/77,t3705/t3602/t1011/t1090/t6428green;t109264/106.
📦 Partial clone / promisor / lazy objects
filter=blob:none|tree:0|sparse|combineon clone/fetch, lazy fetch on touch,backfill/promisor-hydrate.- Harness:
t041038/38,t562010/10,t40679/9,t61102/2;t561644/47.
🪝 Hooks
- Multihook ordering,
core.hooksPath, full v1 hook set wired with correct stdin/stdout/env. - Harness:
t180044/44,t750322/22,t557111/11,t5401/2/3/4green;t5407/t7505improved.
🔀 Core workflows (non-interactive)
checkout/restore/reset,merge,cherry-pick/revert/rerere,statusv1/v2,log.gc/repack/maintenance runwith scheduler backends, incremental/geometric repack, midx expire.- Harness:
t7201-co46/46,t710238/38,t7508-status121/126, cherry-pick family green,
t7600-merge81/83,t7900-maintenance71/72,t6500-gc34/35.
🧩 Submodules
init/update/sync/deinit/status/foreach(non-interactive), gitlink handling.- Harness:
t7400-submodule-basic49→111/124,t740318/18,t740643/70,t740721/23.
🏗️ Foundation & quality
- Repository session/discovery hardening (
t1510109/109,t1517191/191). - Workspace-wide clippy cleanup: ~180
unwrap/expectdeny-lint errors converted to proper
error handling (behavior-preserving).cargo fmtclean;grit-liblib tests 229/0; clippy green.
Scope & known limitations
See docs/v1-scope.md for the full
in-scope/out-of-scope breakdown. Out of scope for now: interactive modes (-p/rebase -i),
complex HTTP auth (Digest/NTLM/Negotiate), fsmonitor, and server-side daemons. Partial areas:
submodule --recurse-submodules checkout, sparse-index lazy expansion (t1092), and some log formats.
Full Changelog: v0.1.6...v0.2.0
What's Changed
- remove plans by @schacon in #760
- Library worktree support and t2402 harness by @schacon in #761
- fix: handle gitfile GIT_DIR in repo setup by @krlvi in #762
- fix: handle diff outside repo by @krlvi in #763
- fix: format rev-parse git paths by @krlvi in #764
- fix: deduplicate commit-tree parents by @krlvi in #765
- fix: honor full log decorations from config by @krlvi in #766
- fix: honor disabled reflog auto creation by @krlvi in #767
- fix: validate loose objects in pack-objects by @krlvi in #768
- fix: handle invalid double-star wildmatch by @krlvi in #769
- fix: avoid duplicate update-ref transaction hooks by @krlvi in #770
- fix: honor long magic pathspecs in add by @krlvi in #771
- Worktree: linked HEAD, submodules, config, and harness by @schacon in #772
- fix: sparse-checkout worktree config and apply (t1091 54/77) by @schacon in #773
New Contributors
Full Changelog: v0.1.6...v0.2.0
v0.1.6
v0.1.3
What's New
- Renamed crate from
grit-rstogrit-cli—cargo install grit-clinow installs thegritbinary - Shell installer —
curl -fsSL https://grit-lib.com/install | shfor macOS and Linux - GitHub Actions release workflow — pre-built binaries for macOS (x86_64 + ARM), Linux (x86_64 + ARM), and Windows on every tagged release
- Updated website — install section with copy-to-clipboard, "Try the CLI" hero CTA
Full Changelog: v0.1.2...v0.1.3