NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1430 most downloaded on crates.io
A crate of the gitoxide project dedicated to implementing the git transport layer
Last release 13 days ago
25 Sep 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 57 of 58 stable releases
3 versions withdrawn
withdrawn after publishing
4 years old
61 releases · first in 2023
One column per quarter.
Capabiltiies::from_lines() takes a single buffer. That way it doesn't have to convert to String as intermediary which may fail as illformed UTF8 might
<csr-id-5bef0a00e8d01110c054a517f6d9696f981a7efc/> <csr-id-2f3725efcaa439db4e10ade1b9fbeb1258fd93c1/> <csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/> <csr-id-533e887e80c5f7ede8392884562e1c5ba56fb9a8/>
<csr-id-08dcda254bc942dcc36d432cf7130c2ce4c6d54e/> Capabiltiies::from_lines() takes a single buffer.
That way it doesn't have to convert to String as intermediary
which may fail as illformed UTF8 might be present.
Performance wise, reading all lines ahead of time, it is the same as it was before as it would collect all lines beforehand anyway.
We are also seeing only a few lines in V2, and in V1 it was fully streaming already.
<csr-id-4308a209dddcbb461c34d45fb9af8b4621d4600a/> max-pure now builds without any C build tooling due to lack of openssl-sys.
To make this work, we leave the reqwest configuration to downstream crates.
Note that this means downstream will have to select their TLS settings
themselves, so builds may fail after upgrade until this is done.
An example for a reqwest configuration can be found in the
gitoxide Cargo.toml in the root of the gitoxide repository.
<csr-id-6fa27642aa57613cae82ae680f02923dad25d474/> ptions for client::connect() and support for more than one ssh variant, including permission-denied detection.
Options can be passed down to client::ssh::connect() to further configure it
similar to what git itself offers. That way, it's possible to use different ssh commands
and support all of gits configuration options.
Support for multiple ssh variants was added to use them (and their flags) correctly.
Detection of permission-denied errors due to invalid credentials was added so re-authentication in upper layers can be implemented.
<csr-id-041eca547a6629c8540728eba95dbcd636285ba9/> make streaming otional for any reqwest.
One can now indicate when initiating a reqwest that the transport doesn't
have to stream the data, even though it will always be provided to an
std::io::Write.
Note that this is at the discretion of the transport implementation and streaming might still be done despite it not being requested.
Note that the caller should set this 'streaming' flag if the upper bound of data is high for keeping it in memory or can't be estimated. This is generally true when sending packs.
<csr-id-1204bfcaadd31ed198b923df05f19115da3754a4/> Provide support for reading packetlines directly.
The handshake response itself now provides a ref read implementation
with direct readline support. That way one can avoid having to go
through String.
<csr-id-8e158c3f4056f59724fe91587157ef0daa517964/> interpret the FollowRedirects option for the curl HTTP backend.
This comes with changes to the HTTP trait which now requires a base-url
to be provided as well.
<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.
<csr-id-78ad3df64f2c016ba17b158bd9ab1d2341aab399/> add fetch::Transport::configure to generically configure any transport.
<csr-id-32dc1829a5661f66396d109c8d0a8eaae6b1f532/> use git-credentials in git-protocol
<csr-id-07512db093e62d9b9185368bd3fa561cfcd1d1d2/> client::TransportWithoutIO::to_url() returns Cow<'_, BStr>.
That way, it's possible to efficiently return URLs in the right format,
or return generates ones as needed.
<csr-id-fe2042bff9ae38bf76b76cef14986f9f76bded7d/> client::TransportWithoutIO::to_url() returns BString.
That way it will not be lossy in case the URL represents a path, which
is relevant for transports that refer to paths.
Note that this doesn't matter when the url actually is a URL, as it's specified to be valid unicode (I think).
<csr-id-759b5d482de048deb24d14043a173079914e7ac8/> client::TransportV2Ext::invoke() supports owned capabilities.
That way it's easier to pass custom agent strings when invoking.
<csr-id-1cf66c4dbc7a0404701efe4335363c2636ce32f8/> client::http::connect() returns Transport<Impl> directly.
It' can't fail, so no need to return Result<_, Infallible>.
<csr-id-99905bacace8aed42b16d43f0f04cae996cb971c/> upgrade bstr to 1.0.1
<csr-id-9509ce4faeca8b4e1527bac625370403495bb03c/> client::connect() supports anything that parses into a git_url::Url; turn http url back to &str
The http url is always valid UTF-8 and doesn't contain invalid paths,
thus we should have the type system reflect that.
<csr-id-52e8c149ff17ce894cc30d03ead1988f52f0663e/> client::connect() now takes a &BStr as URL
<csr-id-71a43d0bc12661efcb9c94697c704f700a3be488/> use thiserror instead of quickerror
<csr-id-12589cc6f08e4d7aabae30bcdadaa0c2b4850229/> adapt to changes in git-url and use BString to represent URLs.
They can contain paths, which is why String can't repsent a URL
losslessly.
For HTTP urls these are ultimately UTF-8 strings though.
<csr-id-0a2b135d19ce1f1b4b0394befaa3949906322c97/> <csr-id-9a2f7cd55c05f2fdb0ae62f0efca9dfa451694c7/> <csr-id-5034544b36994177009ccc8d6c07cb000b429174/> <csr-id-e701e7e9cc571108ca210fc0ca23494d6a1c7208/> <csr-id-68ed6d7e2cabc3d3bc78a29003863cd4194549fa/> <csr-id-42acc88bbc63850c0d38db70bc46b1058875e2a0/> <csr-id-8e17534b0efa7418eabdc36f89bab9f9db7b2c38/> <csr-id-0fd57c6b491a3c8d0127bc1d1f0eb958437edff9/> <csr-id-e05c1fefeed23dbedf0420e04a2a408510775380/> <csr-id-b1c40b0364ef092cd52d03b34f491b254816b18d/> <csr-id-517677147f1c17304c62cf97a1dd09f232ebf5db/> <csr-id-f6a6a499f20e12e2bcca734bdf3c8599d37f6a6f/> <csr-id-39778fd76191cfdb60df87eab8da59e575e48c78/>
curl backend.
schannel_check_revoke as curl-backend specific configuration.TransportV2Ext::invoke(…,features,…) can take key-value pairs more flexibly.
Value can now also be owned, which is useful if the value type is a
Cow<'_, String>.<csr-id-5f2276b63129163096be3cb229864fc589348da8/> <csr-id-ff0332e815c228cc5cdfe58c3598ad261bb2879e/> <csr-id-85dcda81d3fec03ad5687b0e0329cefedd925722/> <csr-id-0d0eb4aa46b265f97ada7b54d8bcc29decc42e50/> <csr-id-4927adf1a57166b581fc293a33f84ef628af70db/> <csr-id-7ab7c2409a47fae587531c0c3b203cd646e32984/> <csr-id-b0083e38c82829b4d8b81542fc8d1025089e2869/> <csr-id-375051fa97d79f95fa7179b536e616c4aefd88e2/> <csr-id-4b5d6dfb58f325bba692e1e32636c24ba058022f/> <csr-id-41b0c19e1aca9406015932862058756af2a26dda/> <csr-id-6d8b66a9bee901eb8cb869e6e28dbb25988f1fed/> <csr-id-237682a529dc54e33e4738f34915d872aeb89514/> <csr-id-5220f9a59fb699e111342b076145a6899d36d433/>
<csr-id-eff7ad79d8b920ab9d936d6268060cfc8ae1b47a/> make clear in docs that the writer needs to be dropped for good measure. Otherwise, some transports might deadlock.
<csr-id-acb4c170395779d1c34d74951121acd5c5b19c65/> Use single quotes for ssh path arg Git uses this method of quoting args for SSH transport too Some Git SSH servers require this method to be used (eg. BitBucket)
<csr-id-85c33825678bddde5a3fe409bbb1ff5cecd3a0fc/> Place port for PuTTY and derivates in separate argument All three PuTTY clients require the port to be separated from the "-P" argument
<csr-id-6ba799c9d6b17ed665d3c352c3c4bb35c9f771bb/> gix clone ssh://... won't deadlock anymore.
For cargo specifically we now parse stderr to see if permission errors
occour. This links stderr and stdout and we have to pass information from
a supervisor thread that parses stderr to stdout and use the information to
return a custom io error in time.
Now the algorithm is adjusted to never be able to deadlock, as the problem
is inherently racy and somewhat hard to implement it properly especially without
a good test suite built-into gitoxde - there are no ssh servers one can easily
spin up cross-platform.
<csr-id-ec2f2e31a714334bc0942eab08d306d4e0952933/> file:// command invocation won't spill stderr output. This usually doesn't add any benefit to the user as we might see events like the git process' failure to flush to a closed channel even though this is entirely handled by the Rust side of things.
I can imagine that one day this might become a configurable to help with debugging to help making better-behaved clients, but maybe it won't ever matter once the default file:// transport is built-in and native.
<csr-id-fed38c90df546c4bfc57ef66c92b4c9312c90586/> improve error message for when an invoked transport program can't be found.
<csr-id-f0997bfab2ba66fb12b0c9d4d673faeabda9687c/> assure processing thread is up before continuing. That way one may hope that we never leave stderr output unprocessed.
<csr-id-923278b4f245c31245a83f5f4d6e3b7dce8134e2/> port selections for SSH urls are now respected for protocol V1 as well.
<csr-id-0ff127c62c2cc47b93ef4af108a382c62af1d3fb/> propery adjust host argument for ssh program to include a user name.
Otherwise it would not use a user at all which then defaults to the currently logged
in user, something that typically won't work with servers that demand git.
<csr-id-c62e5c7d415351aefafeb75f0ab926c7c45c6ede/> fixes SSH clone from scp-like/relatives URLs
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 26 times to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
04b9ca0)e695eda)0c81769)a517e39)145103d)4a9a05f)f536bad)a0bc98c)2f75db2)e1861ca)58ab2ae)c857d61)6b5c394)9d6f263)719b6bd)2f43a54)f293b63)9a493d0)6776a3f)0cae25b)84cb256)client::Capabilities lifetimes now point to 'a instead of 'self. (4b5d6df)41b0c19)Drop for SpawnProcessOnDemand. (6d8b66a)client::Capabilities. (e05c1fe)&dyn Any instead of unspecified serialization format, as it's the right way. (779eefe)fetch::Transport::configure to generically configure any transport. (78ad3df)client::http::connect() returns Transport<Impl> directly. (1cf66c4)fbb96e4)5bef0a0)4720666)bstr to 1.0.1 (99905ba)git-url (bb83843)conenct() signature compatible with the blocking implementation. (5220f9a)1c5f561)git-transport (94a623b)connect() to match new signature (eb15a79)client::connect() supports anything that parses into a git_url::Url; turn http url back to &str (9509ce4)client::connect() now takes a &BStr as URL (52e8c14)connect() method is available in when async-std feature is set along with async-client (f6a6a49)thiserror instead of quickerror (71a43d0)git-transport (30b7b67)git-url (9456146)git-url and use BString to represent URLs. (12589cc)caa7a1b)7ab7c24)rust-version to 1.64 (55066ce)8c0bca3)7fc00f8)59e9fac)48f5bd2)a5869e0)41d57b9)e313112)6efd0d3)6ccc88a)c9275b9)1727fe9)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-transport to gix-transport (8c353ea)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-tui to gix-tui (8782262)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-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)109f434)1ecfb7f)c196d20)7c846d2)1e544e8)39ed9ed)eff7ad7)bac57dd)e22080e)7bba270)5bf9547)cc35025)deed1f1)acb4c17)021248c)85c3382)5b5b380)93bef97)b93f0c4)9e04685)b5408ba)PostBodyDataKind (7fa757f)ffb5b6a)4381a03)76c99f3)gix clone ssh://... won't deadlock anymore. (6ba799c)e0b12fe)ec2f2e3)5ac9fbe)30d8ca1)fed38c9)f0997bf)c60c89d)511ed00)f8c562a)client::connect() and support for more than one ssh variant, including permission-denied detection. (6fa2764)923278b)host argument for ssh program to include a user name. (0ff127c)bb0a07b)d821fc5)curl backend. (d59d362)3678a6a)24070a3)c62e5c7)08ec3a9)68ce15d)5afa7f5)e6b9906)7114bbb)041eca5)5f2276b)94750e1)curl backends. (0a2b135)ff0332e)70ccbb2)bb60d3d)89230f4)3e27550)IsSpuriousError trait and its implementation. (9a2f7cd)85dcda8)0d0eb4a)eb4c5f0)4927adf)eca6705)dadd896)2d033ab)9d8e32d)1204bfc)Capabiltiies::from_lines() takes a single buffer. (08dcda2)747008d)6b9632e)client::http::Options::no_proxy to disable a proxy for given hosts. (5034544)client::http::Options::verbose to see more debug output. (e701e7e)7893502)8e158c3)a4ff140)bcd9654)0abab7d)b2c301e)e4648f8)03ff188)c7cba33)0e4462d)3d8fa8f)63b9050)68ed6d7)c048990)http.proxyAuthMethod (92f88c9)0c253b1)fe5721f)665b53e)42356ab)4d84a20)client::RequestWriter::into_parts() to obtain a bare write handled along with a buf reader with packetline capabilties. (42acc88)0573107)1766568)git does (ee0276c)proxy-type similar to how git does it (717b09f)f4ff821)0c9c48b)0d1a00d)Debug to client::http::Options (375565f)client::TransportWithoutIO::to_url() returns Cow<'_, BStr>. (07512db)client::TransportWithoutIO::to_url() returns BString. (fe2042b)Debug impl on transport option types (7ca4dec)b9a5eea)client::TransportV2Ext::invoke() supports owned capabilities. (759b5d4)TransportV2Ext::invoke(…,features,…) can take key-value pairs more flexibly. (28615b3)user_agent option is going to work on the transport layer (328c069)0b60097)cfc1b9c)reqwest backend (4724604)reqwest backend (c6a474c)a8b3f96)63e24fc)7c5b37d)f0cab31)f5f3a9e)910d665)0dc4c6f)3046646)cf9a53b)a1d876f)d071583)423af90)d13c590)git by removing GIT_CONFIG_COUNT (aa315b4)8f985d4)c4e6849)ea2136b)def53b3)fa27570)70963f5)c9c1658)64f81d7)9065a88)93f2dd8)57d9078)configure_request to return an error as well. (f5e14c3)8a0a5d6)0885e6e)9124583)74573df)de4fe06)client::connect() to function with http-client-reqwest enabled. (375051f)d3c6ae1)a962eb5)dff418d)104d922)d232567)aa80b60)7b9c065)reqwest as blocking HTTP backend via http-client-reqwest feature toggle. (8e17534)9ef6a54](https://gitYour coding agent can read these notes before it upgrades. Set up the MCP server →