NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1156 most downloaded on crates.io
Validation functions for various kinds of names in git
Last release 13 days ago
25 Sep 2026
Ships fairly regularly
a new release about every 2 months
Nearly every release is documented
notes for 24 of 25 stable releases
1 version withdrawn
withdrawn after publishing
4 years old
26 releases · first in 2023
One column per quarter.
preserve validation classifications after error conversion
ValidationError marker from reference, tag, submodule,gix::Error, including optional reference lookups.raise MSRV to Rust 1.88
The newly published dua-core 3.3 release used by linked-worktree removal
requires Rust 1.88, so raise every workspace crate and the advertised badge
together.
Keep the MSRV checks buildable by selecting the latest sysinfo and rusqlite
release lines that support Rust 1.88.
gix repo commit describe
It supports typical but basic flags mostly similar to the ones in git.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Nothing published for this version
3 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6 commits contributed to the release over the course of 30 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
10c58bb)ab2fee1)2cb17b2)e10d5f6)3675a8d)4d5ba23)
</details>add Reserved error variant for name checks. While it's not used by reference checks, it's used when creating gix::FullName which won't support refs/he
Reserved error variant for name checks.
While it's not used by reference checks, it's used when creating gix::ref::FullName
which won't support refs/heads/HEAD anymore.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
f9fbcba)63b8419)d2e193f)392336f)444a92b)package.include patterns more specific so they don't match ignored files (c2c917f)420c5df)6a5a0ec)Reserved error variant for name checks. (ac9379b)29c275e)b1102c2)f7d0975)
</details>Adapt to changes in gix-features which change Send + Sync to Send + Clone. This happens to allow non-sync implementations (i.e. thread-local), along w
<csr-id-4d2d433e7e98ac42db858688edac06e68ee4d10d/>
Adapt to changes in gix-features which change Send + Sync to Send + Clone. This happens to allow non-sync implementations (i.e. thread-local), along with Sync ones
which usually are Clone too as they are passed by immutable reference (which is Clone + Copy).
Option<impl Progress> in favor of impl ProgressArc around should_interrupt flagindex::verify::Mode::* variants
The hash is repository defined and not hard-codedgix mailmap verify commandein find --debug to learn why it is slow<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6e0cd6d)bcde935)89428b2)c4c5678)d2bea27)Option<impl Progress> in favor of impl Progress (bf04644)Arc around should_interrupt flag (d851bed)index::verify::Mode::* variants (c2679a0)d04dc01)1ac2c21)34ea001)9277cf8)239e7b2)8bf585d)3fc1622)a8fa53a)07e9081)8cbe85d)89b628a)6c10e09)21c2dd5)e6a3d43)613483b)73a7393)29fb0c8)0e55fbb)a39d476)5388d80)5494fb3)f23b8d2)e90c123)25da30f)0090961)7cf3545)652a0ac)90c6c5a)ein find --debug to learn why it is slow (70109be)aa51e05)ad3c803)025f157)866530a)d6a72e7)338521b)7d2e20c)b0f7328)
</details>thiserror with a custom implemenation of error types.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
562e684)fa85ed3)64fb9de)dfeefe2)thiserror with a custom implemenation of error types. (6ad2352)3313233)
</details>safely split commands and ignore shebang options
safely split commands and ignore shebang options
Command preparation previously rejected every first word containing an equals
sign, so valid environment prefixes required a shell while executable names
such as tool=name could be misinterpreted as assignment-only commands. Its UTF-8
conversion also made the direct-versus-shell decision depend on encoding.
Git for Windows uses only the interpreter path from a shebang. Parsing the
suffix as shell words invented incompatible semantics and could let executable
contents supply additional interpreter options.
This provides two major fixes:
Reuse the parser in gix-diff and cover its full byte-input domain with focused
unit tests and a dedicated fuzz target.
Store the required command in Outcome::command, reserve Outcome::args for
actual arguments, and reject command lines that produce no executable. Command
preparation can now consume the parser result directly without another emptiness
check or first-element extraction.
The command-line parser is consumed primarily by process-launch code, yet it
returned byte strings that every caller had to convert before constructing
std::process::Command.
Return OsString for the required command and its arguments so callers can use
them directly while preserving arbitrary Unix bytes. Reject values that the host
cannot represent instead of risking a conversion panic; environment assignments
remain byte-oriented for parsing.
Manual argument splitting moved leading assignments into the process environment
and spawned the parsed program directly. On Windows, Rust's lookup can fall
outside the assigned PATH and cannot launch extensionless scripts through their
shebang.
Keep assignment-prefixed commands on the shell path on Windows while retaining
manual splitting for other commands and platforms.
invoke existing absolute paths directly
Shell detection treated metacharacters in every command as evidence that a
shell was needed. This caused resolved executable paths, notably Git for Windows
programs under Program Files, to be parsed as command text and split at spaces.
Recognize existing absolute files as already-resolved programs and bypass shell
detection for them.
Requiring an absolute path avoids promoting a relative path that happens to name
a file in the repository to a program and accidentally executing it.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
89fb308)4da2927)b188a7d)6cc8464)9365cc3)838ff95)8d4c4d1)
</details>This release pins beta versions of clap to avoid it to automatically fetch the latest one during installation.
This release pins beta versions of clap to avoid it to automatically fetch the latest one
during installation.
This is made possible due to clap itself pinning its dependency
to the clap-derive crate.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e104545)5f7f805)631f07a)
</details>assure valid path components are never plain . or ...
. or ...<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
db0b095)0bf84db)3b1bef7)c3c6504)edb449c). or ... (a4801fe)b5e9059)68e6b2e)420e730)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
b41312b)38dff41)7b17da6)01bd76d)1e7d09d)\\?\ (eaa59a3)<reserved>.middle.extension filenames (f5ef10d)br literals to express \ paths more clearly in tests (6daaba3)8df0db2)
</details>7 commits contributed to the release over the course of 55 calendar days.
<csr-id-17835bccb066bbc47cc137e8ec5d9fe7d5665af0/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
dea106a)1f6390c)7ec21bb)rust-version to 1.70 (17835bc)1ca480a)9193b05)e8b3b41)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
8ce4912)bc9d994)7a40648)0f0e4fe)db5c9cf)
</details>13 commits contributed to the release.
<csr-id-64ff0a77062d35add1a2dd422bb61075647d1a36/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
3f7e8ee)795962b)64ff0a7)c2bdda4)b12c7c9)649f588)beba720)37ba461)2e0ce50)030d880)5bf18fb)f992fb7)ec69c88)
</details>A first usable version of gix to make using gitoxide from your applications so much easier. It serves as a one-stop shop for application developers wi
A first usable version of gix to make using gitoxide from your applications so much easier. It serves as a one-stop shop for application developers without sacrificing performance by default while making common use-cases more convenient.
gix as hub crate for application development with focus on usability without sacrificing any knob to tune performance.async for gix-packetline, gix-transport and gix-protocol for fully async git clients, along with the light-async feature toggle to build a gix pack-receive with an async client instead of a blocking one.gix pack-create with the -s/--statistics flag to have data indicating the cost of the operation. Currently it's doing a lot of work that has to be avoided in order to be useable in production and the numbers underline that. Future iterations will cause key metrics to go down.gix-tempfile crategix-lock crategix-ref crate with complete loose-ref, packed-ref and transaction support.git.gix-object parsing is a few percent faster thanks a reworked error handling for objects. By default, error collection is disabled entirely making the error case zero-sized. If needed, verbose and stacked errors can be turned on using a feature toggle for applications who expect repositories with malformed objects and need detailed diagnostics.<csr-read-only-do-not-edit/>
.lock extensions per component.
Previously, it would allow foo.lock/bar, and now it doesn't...
Just like in Git, it's considered invalid.validate::tag::name() now rejects names starting with slashes, and with empty components, too
It's a breaking change as it renames the DoubleDot variant of tag::Error to RepatedDot, while moving
a couple of variants from reference::Error to tag::Error<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d19af16)0f25841)ccc7a1f).lock extensions per component. (62f586c)d51f330)9683186)validate::tag::name() now rejects names starting with slashes, and with empty components, too (13c7922)0401758)12313f2).. (91d29c3)9fa1054)
</details>add path::component_is_windows_device() That way it's easy to determine if a component contains a windows device name
path::component_is_windows_device()
That way it's easy to determine if a component contains a windows device nameCON device names and more if gitoxide.core.protectWindows is enabled.
Note that trailing . are forbidden for some reason, but trailing (space) is forbidden
as it's just ignored when creating directories or files, allowing them to be clobbered
and merged silently.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4f98e94)9511416)d6cd449)79dce79)1242151)path::component_is_windows_device() (f1f0ba5).git path variants (4791e31)ccbc119)fcc3b69)bad9a79)1076375)CON device names and more if gitoxide.core.protectWindows is enabled. (a67d82d)eff4c00)
</details>This is a maintenance release.
This is a maintenance release.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
b050327)52c3bbd)3e5c974)f8ce3d0)
</details>1 commit contributed to the release over the course of 8 calendar days.
<csr-read-only-do-not-edit/>
<csr-id-3bd09ef120945a9669321ea856db4079a5dab930/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
972241f)8c492d7)rust-version manifest field back to 1.65. (3bd09ef)
</details>1 commit contributed to the release over the course of 1 calendar day.
<csr-read-only-do-not-edit/>
<csr-id-aea89c3ad52f1a800abb620e9a4701bdf904ff7d/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e1aae19)e78a92b)4454c9d)aea89c3)
</details>42 commits contributed to the release over the course of 95 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
55d386a)d3dcbe5)c0e72fb)b65a80b)
</details>add validation for submodule names
tagname and refname.
These were duplicate paths to the same function, and callers may always
rename them on use.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4604f83)gix-submodule (f3c4311)b629f8a)tagname and refname. (a9da3f8)afb1f02)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
16295b5)c4cc5f2)5cb3589)2fc66b5)9064ea3)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ea9f942)18b0a37)aa16c8c)4f635fc)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
9a9fa96)8f15cec)67da689)0269eed)420553a)2578e57)3ef5c90)9375cd7)facaaf6)
</details>A maintenance release without any user-facing changes.
A maintenance release without any user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
5dc1f9f)3016a28)typos tool. (2321eb9)
</details>compatibility with bstr v1.3, use *.as_bytes() instead of .as_ref(). as_ref() relies on a known target type which isn't always present. However, once
bstr v1.3, use *.as_bytes() instead of .as_ref().
as_ref() relies on a known target type which isn't always present. However, once
there is only one implementation, that's no problem, but when that changes compilation
fails due to ambiguity.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
9604783)bstr v1.3, use *.as_bytes() instead of .as_ref(). (135d317)
</details>upgrade edition to 2021 in most crates. MSRV for this is 1.56, and we are now at 1.60 so should be compatible. This isn't more than a patch release as
<csr-id-4d6ce803da12298b5780af920479679a39d923a0/> <csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/> <csr-id-533e887e80c5f7ede8392884562e1c5ba56fb9a8/>
<csr-id-3d8fa8fef9800b1576beab8a5bc39b821157a5ed/> upgrade edition to 2021 in most crates. MSRV for this is 1.56, and we are now at 1.60 so should be compatible. This isn't more than a patch release as it should break nobody who is adhering to the MSRV, but let's be careful and mark it breaking.
Note that git-features and git-pack are still on edition 2018
as they make use of a workaround to support (safe) mutable access
to non-overlapping entries in a slice which doesn't work anymore
in edition 2021.
bstr to 1.0.1<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
04b9ca0)e695eda)0c81769)a517e39)145103d)d44369a)4a9a05f)f536bad)a0bc98c)e1861ca)58ab2ae)c857d61)6b5c394)9d6f263)719b6bd)2576168)caa7a1b)rust-version to 1.64 (55066ce)e313112)6efd0d3)6ccc88a)c9275b9)git-testtools to gix-testtools (b65c33d)git-pack to gix-pack (1ee81ad)git-odb to gix-odb (476e2ad)git-index to gix-index (86db5e0)git-diff to gix-diff (49a163e)git-commitgraph to gix-commitgraph (f1dd0a3)git-mailmap to gix-mailmap (2e28c56)git-discover to gix-discover (53adfe1)git-chunk to gix-chunk (59194e3)git-bitmap to gix-bitmap (75f2a07)git-protocol to gix-protocol (823795a)git-refspec to gix-refspec (c958802)git-revision to gix-revision (ee0ee84)git-transport to gix-transport (b2ccf71)git-credentials to gix-credentials (6b18abc)git-prompt to gix-prompt (6a4654e)git-command to gix-command (d26b8e0)git-packetline to gix-packetline (5cbd22c)git-worktree to gix-worktree (73a1282)git-worktree to gix-worktree (108bb1a)git-url to gix-url (b50817a)git-date to gix-date (9a79ff2)git-attributes to gix-attributes (4a8b3b8)git-quote to gix-quote (648025b)git-config to gix-config (3a861c8)git-ref to gix-ref (1f5f695)git-lock to gix-lock (2028e78)git-tempfile to gix-tempfile (b6cc3eb)git-object to gix-object (fc86a1e)git-actor to gix-actor (4dc9b44)git-validate to gix-validate (5e40ad0)git-validate to gix-validate (dff9053)git-hash to gix-hash (4a9d025)git-features to gix-features (e2dd68a)git-glob to gix-glob (35b2a3a)git-sec to gix-sec (eabbb92)git-path to gix-path (d3bbcfc)git-config-value to gix-config-value (622b3e1)c196d20)7c846d2)1e544e8)39ed9ed)e6b9906)7114bbb)eca6705)5cda36e)bcd9654)b2c301e)e4648f8)0e4462d)3d8fa8f)25a7726)29a043b)fd14489)e10554d)bc64b96)cfa1440)4974eca)e2ee3de)31c2351)f7f136d)533e887)085e76b)a22b1d8)598c853)654cf39)8131227)59ffbd9)a474395)21541b3)bf0106e)7bcbf9d)5e0edba)fdd844a)c40faca)bf15c2a)70ef344)0d5c8b9)9cef2f2)431dd86)a77a71c)02f127b)c808cb1)87db688)a593e79)1b04c39)6b33678)3286e42)7a443ff)30177e8)1327894)0758867)474b73b)5312310)4f5a1d0)db3f1b1)6b4f937)1ec4a54)530d392)
</details>Your coding agent can read these notes before it upgrades. Set up the MCP server →