NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1222 most downloaded on crates.io
A crate to handle git references
Last release 26 days ago
23 Aug 2026
Ships on a steady schedule
a new release about every 4 weeks
Nearly every release is documented
notes for 56 of 59 stable releases
2 versions withdrawn
withdrawn after publishing
4 years old
61 releases · first in 2023
One column per quarter.
gix index entries also prints attributes.
gix index entries also prints attributes.gix clone and gix fetch with controls for shallow repositories.ein t trace-path know accepts the trace-file alias.stdout on each write, now this is done only once.gix free index entries into gix index entries.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ed63ec0)7bd8823)f37a930)gix index entries also prints attributes. (08e8fc2)dd14a80)gix free index entries into gix index entries. (ca8ebdf)3456c84)gix-worktree (13a070f)69faad0)8d5762c)23ee47f)3d47919)9237121)ee36e5b)bbb4cb0)index.skipHash (f29f35c)3836cc0)cc0f506)c502fa8)531dd19)gix clone and gix fetch with controls for shallow repositories. (9723e1a)ein t query (d5616b6)8ef1cb2)3827ac6)ein t trace-path know accepts the trace-file alias. (f93e964)
</details><csr-id-ebc7f47708a63c3df4415ba0e702660d976dfb3e/> <csr-id-2290d006705ff47ad780b009fe58ee422b3285af/> <csr-id-0e1875363fea09452789d7a90fc6860a7996d6d3/> <csr-id-c46dec311c76a83dba136be5dba6b70d739c354d/> <csr-id-951c050ecbb70c9de216603e55c7cfbc89a067e3/> <csr-id-725210dc401406fe9450eae9d375b0238d645027/> <csr-id-4ed4b2da50557aff540685441f4b5c7d5e582977/> <csr-id-293bfc0278c5983c0beaec93253fb51f00d81156/> <csr-id-90e6128727932f917c485f411e623fc6a9c2ad4d/> <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.
<csr-id-0ace957c595c8a38afb7de1462cdc73b617d2a76/> Turn FullNameRef into an actual reference type.
That way Cow<'_, FullNameRef> works as expected.
<csr-id-e699291097cec346374a30c325848f787ca9d736/> file::Transaction::prepare() now takes two git_lock::acquisition::Fail instances.
This allows to configure the file-ref lock failure mode differently from
the packed-refs lock failure mode, which is exactly what git does as
well defaulting them to 100ms and 1000ms till lock acquisition gives up.
<csr-id-0f753e922e313f735ed267f913366771e9de1111/> Target(Ref)?::try_name() now returns Option<&FullNameRef>.
That way, the name is actually directly usable in most methods that
require a validated name as input.
<csr-id-3d6299f47f41397c1c72035a86b94d1c263b5b98/> Transaction::commit(…) takes git-actor::SignatureRef instead of …::Signature.
This makes the API more versatile and corrects a shortcoming that was
caused by SignatureRef previously being unable to serialize itself.
<csr-id-f1dbb6bd4534527b6f1f2aba2a562dd4e64cf55d/> remove FullName::to_ref() in favor of •::as_ref().
This became possible now that FullNameRef is a proper ref, not just
ref-like.
<csr-id-1611c3ddff6c930deaa4c2440383f5684c029b28/> rename PartialNameRef to PartialNameCow
Because this is what it is, which also implies that it's not Copy
anymore which a Ref would definitely be.
The reason we need this to be a Cow is to support passing ownership.
<csr-id-8a92ec9834b6d5aa3057c5509f6c13b6a6cd6e1b/> remove Store from public API
It is unclear if ref-tables, which are the reason for it to exist in
the first place, will fit into the concept as they might not support
worktrees. It's entirely unclear how this works.
Maybe there can be a non-worktree version of the store with work-trees only being supported by the file based ref database, and ref-tables remaining a server-side feature.
<csr-id-2becffc85ff6225522fe38482739fb1406ae1060/> rename file::Store::base() to git_dir().
That way it is clearer what it actually is especially in presence
of the newly added file::Store::common_dir() method.
That way, work-trees can eventually be properly supported.
<csr-id-7984e19417dff13445f3ef2e15dea96bbd194ce5/> Target::as_(id|name) -> Target::try_(id|name)
Conform to naming conventions, whenever something returns an option
or Result while there is a more direct name that panics, prefix try_.
<csr-id-dea6659a404bf8b2ad1290549653c776ec04f964/> Required object_hash as parameter when instantiating any Store
This is needed to choose the correct kind of object hash in a couple of
situations, and future-proofs it for when ref-table arrives.
<csr-id-b431fb0fb58b5e2e8aadbbd6aead55c0e42bd67b/> rename file::Store::packed_buffer() to …::open_packed_buffer()
This makes much clearer what it actually does, as previously it might
have been a stored packed buffer as well.
<csr-id-80f3d504eeb669f16c5621fac06f6c763ce84e47/> file::Store::from(PathBuf) removed
At this low level, it's important to be clear about RefLogs and rather
force the caller to specify the ref-log mode. Technically it depends
on a few factors, git-repository deals with them, but certainly
shouldn't default to anything without being clear.
<csr-id-bfb32aee4e64fd6b1f18c830623cc3fddd059874/> Reference log line access
<csr-id-5d498a33236391d8e456f267b1bf6af24de66f11/> file::Store::iter() is now a platform, with .all() and .prefixed(…) respectively
This way, it's possible to keep shared ownership of the packed buffer
while allowing the exact same iterator machinery to work as before.
<csr-id-4641499abe00acf6eef0ab6d6bf261b0a27795f8/> file::ReferenceExt::follow(…) now without packed refs parameter
<csr-id-55940eb8316d83ac1376c57ba25b3115d62f2012/> file::ReferenceExt::peel_to_id_in_place(…) now without packed-refs buffer
It is instead read from the internally synchronized buffer, shared
across all instances.
<csr-id-15d429bb50602363292453606902bdce5042d9a5/> file::Store::(try_)find(…, packed) was removed
The packed buffer is now handled internally while loading it on demand.
When compiled with git-features/parallel the file::Store remains
send and sync.
The packed refs buffer is shared across clones and it's recommended
to clone one file::Store instance per thread, each of which can
use its own namespace.
<csr-id-95247322a8191edfa7fac9c5aa72b40239f3aa88/> move git_ref::file::WriteRefLog to git_ref::store::WriteRefLog
<csr-id-584b705cee8be3fb68c67dcb8535b981d1efc5f4/> assure symrefs don't get deleted when moving refs to packed-refs. Previously it was possible for symbolic refs to be deleted right after they have been created or updated as they were included in the set of refs that was assumed to be part of packed-refs, which isn't the case for symbolic refs.
<csr-id-9f848506f5a42abc954612ea375f845e3b23ae5a/> case-insentively conflicting references can be created even on case-insensitie filesystems*. The asterisk indicates that this only works if packed-refs are present and these references are written straight to packed references without ever trying to handle the otherwise conflicting loose reference files.
This is done by leveraging the fact that in presence of packed-refs or a pending creation of packed-refs, there is no need to create per-file locks as concurrent transactions also have to obtain the packed-refs lock and fail (or wait) until it's done.
<csr-id-e9853dd640cf4545134aa6e0d093e560af090a2b/> instead of erroring if loose iteration is performed on missing base, correctly yield zero references.
Previously it reported an error, now it does not and instead performs no
iteration, which is more helpful to the user of the API I believe as
they won't randomly fail just because somebody deleted the refs
folder.
<csr-id-27386a96ddc022ba75730901f8bb098b9d5ff9d4/> loose ref iteration on a repo with missing 'ref/' fails when creating the iterator. Previously, it would fail on first iteration, making it seem like there is one reference even though it's just an error stating that the base cannot be read.
This is clearly worse than making a metadata check on the filesystem, no matter how unlikely the case.
<csr-id-6e5c0ae63deed181419232c61896e22404e4c84a/> allow symref updates to receive reflogs if these are new… …and well-known on top of that, that means having an exact expectation on what should be present.
This allows symrefs to be created with reflog.
<csr-id-1d2003519e3b0f745af1524a32f2816475024b31/> always update modification date when packed refs are forcefully reloaded. The latter happens right after the file was written, which means we definitely have to update our modification date or else the buffer will be read again next time somebody asks for an up-to-date version.
The ordering of operations is such that at worst, the buffer is loaded again instead of keeping an outdated version of it, which would happen if the metadata is read afterwards.
<csr-id-42e0487286c1f745837c0ce337ed7c9d86b14516/> support Rust 1.52
file::Transaction::rollback() allows to explicitly roll back a pending change.
As opposed to dropping the Transaction, this method allows to obtain all
edits that would have been applied.transaction::Change::new_value() to get easy access to new values of references.
That's more convenient than matching on the enum.FullName::try_from(&BString) for convenience.
Sometimes when matching one only has a &BString, and it's hard to
convert it to &BStr without an extra line of code, it's cumbersome,
so we workaround by adding another conversion.Reference::delete() for simple reference deletionstore::WriteRefLog::Always to unconditionally write reflogs.Reference to be serialized/deserialized with serde.Category::LinkedRef
With it one can access all refs as advertised.Category::MainRef
With it it will be possible to compute all paths correctly and actually
perform certain operations as documented.Category::(WorktreePrivate|Bisect|Rewritten)Category::LinkedPseudoRefCategory::MainPseudoRefCategory::PseudoRefFullName(Ref)::category_and_shortname()
It's a combination of shorten() and category() for convenience.Fullname(Ref)::category() and Category
A way to classify references.git_config::values::Path for a typesafe git path
Add a Path type to the git_config::values which
can be interpolated according to gits own path interpolation
rules.FullName.file::Store::iter_(prefixed_)packed()
These methods allow using an own packed buffer, usually obtained through
cached_packed_buffer().file::Store::cached_packed_buffer() for packed refs snapshotsPartialNameRef to be created from owned items<csr-id-65c5589a419b2856c1576d838d4444554d7a582b/> commiting the revlog transaction is now optional. This also means that providing no committer despite one being needed is will cause the transaction to fail entirely with an error.
Doing this allows users who disable the reflog not to have to deal with committer configuration at all.
<csr-id-328900add089f40d3bf9f1019c9f31663da387e2/> support for non-'static PackedRefs transactions. When configuring for packed-refs updates, previously one needed to provide a function to find objects that could not borrow data due to implicit 'static requirement. This has been lifted to allow it to access references to data on the stack.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 40 times to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
52b38bc)e695eda)0c81769)a517e39)145103d)4a9a05f)f536bad)a0bc98c)e1861ca)58ab2ae)c857d61)6b5c394)9d6f263)719b6bd)Target::id() and TargetRef::id() (4ed4b2d)293bfc0)90e6128)6776a3f)a88981b)3ab990e)58294dd)e41ab82)f6181af)03bcac2)file::Store::iter_(prefixed_)packed() (6a17416)file::Store::cached_packed_buffer() for packed refs snapshots (9eb3a31)file::Store::packed_buffer() to …::open_packed_buffer() (b431fb0)b030884)80f3d50)bfa417b)72a6464)951c050)bfb32ae)1cd2362)f5570ff)fbeddeb).all() and .prefixed(…) respectively (5d498a3)5fc3817)00c2545)a9096b9)4641499)file::ReferenceExt::peel_to_id_in_place(…) now without packed-refs buffer (55940eb)15d429b)ae2eef1)f5c3c8f)file::Store::base is now file::Store::base() and read-only (0e18753)a76f041)0af5077)82ea1b8)fc753a8)f87f852)fc6480b)git_ref::file::WriteRefLog to git_ref::store::WriteRefLog (9524732)4dec3ea)4d55a8f)ecb539a)814de07)FullName. (cf50ae2)28e3251)84cb256)4a5176a)7571be5)c64a77f)200384c)78658c7)5521391)8cf0302)ba17b40)1b3a6da)7777f7e)ad37a64)014459b)f067286)c2ac110)c46d838)07dc555)6f52606)8f3a4b5)96efbb1)797af14)3cea2ad)1acf875)9c5ab38)b362fb5)Transaction::commit(…) takes git-actor::SignatureRef instead of …::Signature. (3d6299f)b987575)096ee5f)d69b56e)befe949)c78008e)Cow at all in favor of a simple &PartialNameref (1bc9a87)7da239f)Cow<PartialNameRef> (2ae129a)15afec1)3e470da)21109ca)FullName::to_ref() in favor of •::as_ref(). (f1dbb6b)77877e0)7666034)cebf736)1aa546d)2b6982e)3031f99)main-worktree is also resolved in the main worktree (bc3c05e)0079ab6)b12884a)4aac3c2)e189914)d3a12e3)dd7be18)c4d2493)e93c222)a25b0bc)d25b3ca)6478736)ae57e27)37deca5)19d53fb)32b8fde)09eb432)f83910f)61b449c)14c6f48)8c52fe4)202bafc)PartialNameRef to PartialNameCow (1611c3d)4e26e62)a611224)467d583)3574a4e)Category::LinkedRef (9cccce3)Category::MainRef (eada5df)Category::(WorktreePrivate|Bisect|Rewritten) (0304b7f)Category::LinkedPseudoRef (612a2db)Category::MainPseudoRef (613b584)Category::PseudoRef (6ccfea9)Store from public API (8a92ec9)file::Store::base() to git_dir(). (2becffc)cc2d810)f158648)git-path crate instead of git_features::path (47e607d)c55cac6)50ff7aa)60bcffc)8ca400c)72b97f2)2e1437c)71a086a)9c294bf)6b283dc)1cc95ce)909aa14)9258b7b)7c53b27)624ad2e)4b320e7)777b40c)git-features (07168c7)git-ref (8d0cce7)78222c2)ReloadIfChanged in git-ref (e8de0ef)1d20035)Reference to be serialized/deserialized with serde. (f3c609f)328900a)8b5cf38)6e5c0ae)transaction::Change::new_value() to get easy access to new values of references. (370ed3d)file::Transaction::prepare() now takes two git_lock::acquisition::Fail instances. (e699291)FullName::try_from(&BString) for convenience. (658c125)4850202)6f60a79)140e690)dad9cbe)quick-error with thiserror (725210d)git-validate (4eac45f)caa7a1b)584b705)66b053d)9f84850)e9853dd)27386a9)3f54ade)063ab73)file::Transaction::rollback() allows to explicitly roll back a pending change. (e86e159)bbdb480)rust-version to 1.64 (55066ce)8c0bca3)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-lfs to gix-lfs (b9225c8)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-hashtable to gix-hashtable (26a0c98)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-ref to gix-ref (a56e628)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)Your coding agent can read these notes before it upgrades. Set up the MCP server →