crate-status.md
gix is a command-line interface (CLI) to access git repositories in various ways best described as low-level for use by experts or those validating functionality in real-world scenarios. Performance and efficiency are staples of the implementation.
ein is reserved for one-off tools that are useful to many, and will one day implement a truly unique workflow with the potential to become the preferred way to interact with git repositories.
Please note that all functionality comes from the gitoxide-core library, which mirrors these capabilities
and itself relies on all gix-* crates. It's not meant for consumption, for application development, please use gix.
ein program - convenient and for humans
main branchgix program (plumbing) - lower level commands for use during development
gix --help to start discovery.This overview intentionally ignores gix CLI availability. It tracks whether the plumbing exists to implement a typical
Git command in an application or a future porcelain.
Items from the historical gix 1.0 tracking issue are folded into the relevant crate sections below if they still match
today's code and goals.
Note: Generated by Codex, but still good for an overview. Reconcile on demand.
clone, fetch, ls-refs and shallow variantscommit and low-level ref/object/index mutationstatus and worktree-vs-index comparisongix-diff and gixmerge-base, revision parsing and commit descriptioncheckout, switch, restore and reset - mainly gix, gix-worktree-state, gix-index, gix-filter, gix-hookmerge, cherry-pick and revert - mainly gix, gix-merge, gix-cherry-pick, gix-sequencer, gix-rerere, gix-hookrebase - mainly gix-rebase, gix-sequencer, gix-merge, gix-apply, gix-rerere, gix-hook, gixbisect - mainly gix-bisect, gix-sequencer, gix-revision, gix-revwalk, gix-traverse, gixstash, am and apply - mainly gix-stash, gix-apply, gix-mailbox, gix, gix-diff, gix-worktree-state, gix-sequencer, gix-rererepush and self-contained clone/fetch over file:// and ssh:// - mainly gix, gix-protocol, gix-transport, gix-sshgix-hook, gix, gix-ref, gix-protocolSHA-256, reftable) - mainly gix-hash, gix-ref, gix-reftable, gix-protocol, gix-odbgix-odb, gix-pack, gix-bundle, gix-protocol, gixcommit-graph, bitmaps, split-index, sparse-index, fsmonitor, untracked-cache) - mainly gix-commitgraph, gix-pack, gix-index, gix-status, gix-dirgix-revwalk, gix-traverse, gix-revision, gix-commitgraphThe top-level crate that acts as hub to all functionality provided by the gix-* plumbing crates.
core.repositoryFormatVersion and extensionsMERGE_HEAD, MERGE_MSG and MERGE_MODE compatible stategit am and git apply workflow orchestration
GIT_CEILING_DIRECTORIES environment variableupstream and push resolution.git credential directlygix_credentials::helper::Cascadediff.*.textconv, diff.*.cachetextconv and external diff viewers with diff.*.command,
along with support for reading diff gitattributes.git describe like functionality, with optional commit-graph accelerationbranch.<name>.merge in the returned remote.consecutive, skipping and noop.FETCH_HEADgit-config, including http.*core.hooksPathreference-transactionfiles and reftable.gitignore handling.gitattributesextensions.worktreeConfig is enabled.core.worktree configuration
GIT_COMMON_DIR and GIT_WORK_TREE isn't implemented.boolean, integer, stringgit-config filesgit replace)name <email> tuples (instead of full signatures) to facilitate parsing
commit trailers.internment,
but needs bumpalo support to avoid item allocations/boxing, and avoid internal Mutex. (key type is pointer based).gix-fs::InternedMap improves performance.Read input
Read to Iterator of entries
delta=false attributegit replace)extensions.partialCloneCheck out the performance discussion as well.
git-apply compatibilityinterhunk-lines)imara-diff crate.textconv filtersmerge=binary attributes (do not load them into memory)merge stylediff3 stylezdiff stylegix-diff feature which could use the same)MERGE_HEAD, MERGE_MSG and MERGE_MODEgit merge --continue and git merge --abortHEAD)Check out the performance discussion as well.
git revlogcommitgraph supportA utility crate with types and functionality related to shallow-file handling.
Read from packet line with (optional) progress support via sidebandsWrite with built-in packet line encodingasync supportconnect(…) for clients
git-upload-pack / git-receive-packssh binarycurl (blocking only)reqwest (blocking only)async supportaccept(…) for serversProvide a native SSH transport and authentication backend so gix users can ship a self-contained client binary.
ssh| feature | curl | reqwest |
|---|---|---|
| 01 | ||
| 02 | X | |
| 03 | X | |
| 04 | X | |
| 05 |
.gitattribute filesbinary macro for -text -diff -merge.gitignore filesabsolutize()realpath()--pathspec-from-file and --pathspec-file-nul)TryIntoPathspec trait to parse strings or accept ready-made pathspecs as well, for use in APIsshGIT_EXEC_PATH environment variable with gix-sec filteraskpass program if availablecmd.exe and mingw terminalsA mechanism to associate metadata with any object, and keep revisions of it using git itself.
noopconsecutiveskippingFETCH_HEAD information back entirelysafe.directory
gitoxide allows access but prevents untrusted configuration to become effective.TimeA basic crate for comon error types and utilities, changed as needed to replace thiserror.
git credential programgit credential-<name>helper::main() for easy custom credential helper programs written in Rusturl.<base>.insteadOf|pushInsteadOf, or an HTTP request is redirected to another host,
helper matching should use the effective URL that is actually contacted, not only the original URL.Provide discovery and execution of Git hooks for client and receive-side workflows.
$GIT_DIR/hooks and core.hooksPathreference-transactionProvide base-implementations for dealing with smudge and clean filters as well as filter processes, facilitating their development.
Provides a trust model to share across gitoxide crates. It helps configuring how to interact with external processes, among other things.
--onto, --keep-base, --fork-point, --rebase-mergesProvide plumbing for git cherry-pick style workflows, including single-pick
and multi-commit sequences.
--continue, --skip, --abort and --quit--no-commit and merge-commit parent selectionProvide plumbing for git bisect / binary-search workflows over commit history.
good / bad / skip, log / replay and reset flowsProvide plumbing for git stash style workflows.
Provide plumbing for git apply and the patch-application parts reused by
git am, git rebase and stash application.
git apply compatible whitespace and path handlingProvide ingestion for email-based patch series as used by git am, separating
mailbox parsing from patch application.
git mailsplitgit mailinfombox variants and metadata normalization needed by git amgix-sequencer, gix-apply and higher-level workflow orchestrationHandle human-aided operations which cannot be completed in one command invocation.
continue, skip, abort and quitgit am sequence support
gix-mailboxCHERRY_PICK_HEAD, REVERT_HEAD, REBASE_HEAD, ORIG_HEAD and bisect refsRecord and reuse conflict resolutions across mergy workflows.
rr-cacheImplement git large file support using the process protocol and make it flexible enough to handle a variety of cases. Make it the best-performing implementation and the most convenient one.
textident.gitignore and .gitattributes in a manner well suited for efficient lookups
describe() (similar to git name-rev)gix-date).gitmodule files, access all their fields, and apply overridesA plumbing crate with shared functionality regarding EWAH compressed bitmaps, as well as other kinds of bitmap implementations.
Array type to read and write bits
true bitA git directory walk.
untracked-cache (as provided by UNTR extension of gix_index::File)The git staging area.
stat update
stat based on thread_cost (aka preload).gitignore and system file exclude configurationSee its README.md.
See its README.md.
gix-config-value crategitdir, gitdir/i, and onbranchhasconfig:remote.*.urlhttp.<url>.* or
credential.<url>.* can be matched after
normalizing scheme, host, port and path in the same way Git does.export-ignore git attributewrite_to() for creating an archive with various container formats
tar and tar.gzzipexport-ignore and export-substindex or any entry within.git/log-found directory structurestrict mode, to check for tree objects with g+w permissionsref starting pointsgit fsck --full due to ODB implementation)git fsck (too many to print here)Provide a reftable backend for refs and reflogs as part of Git 3.0 compatibility.
files and reftablein_paralleljointigA re-implementation of a minimal tig like UI that aims to be fast and to the point.
Definitely optimize for performance and see how we fare compared to oxen.
Right now, git lfs is 40x slower, due to sequential uploads and lack of fast compression. It seems this can be greatly improved to get
close to 6min for 200k images (1.4GB). GitHub seems to cap upload speeds to 100kb/s, one major reason it's so slow, and it can only do
it sequentially as git-lfs doesn't use the new filter-process protocol which would allow parallelization.
Oxen uses the XXH3 (30gb/s) which greatly outperforms SHA1 - however, it doesn't look like the hash is necessarily the bottleneck in typical benchmarks.