gitoxide
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.
- the
einprogram - convenient and for humans- init - initialize a new non-bare repository with a
mainbranch - clone - initialize a local copy of a remote repository
- tools
- organize - find all git repositories and place them in directories according to their remote paths
- find - find all git repositories in a given directory - useful for tools like skim
- estimate-hours - estimate the time invested into a repository by evaluating commit dates.
- Based on the git-hours algorithm.
- See the discussion for some performance data.
- init - initialize a new non-bare repository with a
- the
gixprogram (plumbing) - lower level commands for use during development- As its main purpose is to help running the latest improvements in the real world, it's self-documenting without
duplicating its features here. Use
gix --helpto start discovery.
- As its main purpose is to help running the latest improvements in the real world, it's self-documenting without
duplicating its features here. Use
Plumbing Workflow Overview
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.
- workflows already supported in plumbing
-
clone,fetch,ls-refsand shallow variants -
commitand low-level ref/object/index mutation -
statusand worktree-vs-index comparison - blob and tree diffing - mainly
gix-diffandgix -
merge-base, revision parsing and commit description - worktree streaming, archive creation and low-level checkout
-
- common workflows that still need plumbing across crates
-
checkout,switch,restoreandreset- mainlygix,gix-worktree-state,gix-index,gix-filter,gix-hook -
merge,cherry-pickandrevert- mainlygix,gix-merge,gix-cherry-pick,gix-sequencer,gix-rerere,gix-hook -
rebase- mainlygix-rebase,gix-sequencer,gix-merge,gix-apply,gix-rerere,gix-hook,gix -
bisect- mainlygix-bisect,gix-sequencer,gix-revision,gix-revwalk,gix-traverse,gix -
stash,amandapply- mainlygix-stash,gix-apply,gix-mailbox,gix,gix-diff,gix-worktree-state,gix-sequencer,gix-rerere -
pushand self-contained clone/fetch overfile://andssh://- mainlygix,gix-protocol,gix-transport,gix-ssh
-
- cross-cutting parity work
- hook discovery and execution - mainly
gix-hook,gix,gix-ref,gix-protocol - Git 3.0 compatibility (
SHA-256,reftable) - mainlygix-hash,gix-ref,gix-reftable,gix-protocol,gix-odb - partial clone, promisor and bundle bootstrapping - mainly
gix-odb,gix-pack,gix-bundle,gix-protocol,gix - big-repo accelerators (
commit-graph, bitmaps, split-index, sparse-index, fsmonitor, untracked-cache) - mainlygix-commitgraph,gix-pack,gix-index,gix-status,gix-dir - incremental ancestry exclusion during commit iteration - mainly
gix-revwalk,gix-traverse,gix-revision,gix-commitgraph
- hook discovery and execution - mainly
gix
The top-level crate that acts as hub to all functionality provided by the gix-* plumbing crates.
- utilities for applications to make long running operations interruptible gracefully and to support timeouts in servers.
- handle
core.repositoryFormatVersionand extensions - support for unicode-precomposition of command-line arguments (needs explicit use in parent application)
- strict object creation (validate objects referenced by newly created objects exist)
- strict hash verification (validate that objects actually have the hashes they claim to have)
- workflow composition
- checkout, switch, restore and reset orchestration over refs, index and worktree mutation
- merge workflow orchestration
- persist and resume conflicted merges with
MERGE_HEAD,MERGE_MSGandMERGE_MODEcompatible state
- persist and resume conflicted merges with
- rebase workflow orchestration
- cherry-pick and revert workflow orchestration
- bisect workflow orchestration
- stash workflow orchestration
-
git amandgit applyworkflow orchestration- connect mailbox ingestion, patch application, hook execution and resulting commit creation
- Repository
- discovery
- option to not cross file systems (default)
- handle git-common-dir
- support for
GIT_CEILING_DIRECTORIESenvironment variable - handle other non-discovery modes and provide control over environment variable usage required in applications
- rev-parse
- handle relative paths as relative to working directory
- handle
upstreamandpushresolution.
- rev-walk
- include tips
- exclude commits
- instantiation
- access to refs and objects
- create a pathspec-search from a set of strings
- allow to construct Pathspecs using data structure instead of enforcing them to be passed as strings.
- credentials
- run
git credentialdirectly - use credential helper configuration and to obtain credentials with
gix_credentials::helper::Cascade
- run
- traverse
- commit graphs
- make git-notes accessible
- tree entries
- diffs/changes
- tree with other tree
- respect case-sensitivity of host filesystem.
- a way to access various diff related settings or use them
- respect
diff.*.textconv,diff.*.cachetextconvand external diff viewers withdiff.*.command, along with support for readingdiffgitattributes. - rewrite tracking
- deviation - git keeps up to four candidates whereas we use the first-found candidate that matches the similarity percentage. This can lead to different sources being found. As such, we also don't consider the filename at all.
- handle binary files correctly, and apply filters for that matter
- computation limit with observable reduction of precision when it is hit, for copies and renames separately
- by identity
- renames (sym-links are only ever compared by identity)
- copies
- by similarity - similarity factor controllable separately from renames
- renames
- copies
- 'find-copies-harder' - find copies with the source being the entire tree.
- tree or index with working tree
- rename tracking
- submodule status (recursive)
- diffs between modified blobs with various algorithms
- tree with index (via index-from-tree and index)
- rename tracking
- submodule status (recursive)
- tree with other tree
- initialize
- Proper configuration depending on platform (e.g. ignorecase, filemode, …)
- Id
- short hashes with detection of ambiguity.
- Commit
-
git describelike functionality, with optional commit-graph acceleration - create new commit from tree
-
- Objects
- lookup
- peel to object kind
- create signed commits and tags
- trees
- lookup path
- edit
- references
- peel to end
- ref-log access
- remote name
- find remote itself
- respect
branch.<name>.mergein the returned remote.
- respect
- remotes
- clone
- shallow
- include-tags when shallow is used (needs separate fetch)
- prune non-existing shallow commits
- bundles
- shallow
- fetch
- shallow (remains shallow, options to adjust shallow boundary)
- a way to auto-explode small packs to avoid them to pile up
- 'ref-in-want'
- 'wanted-ref'
- standard negotiation algorithms
consecutive,skippingandnoop.
- push
- ls-refs
- ls-refs with ref-spec filter
- list, find by name
- create in memory
- save to configuration on disk
- write
FETCH_HEAD - apply transport and remote configuration from
git-config, includinghttp.* - groups
- remote and branch files
- clone
- execute hooks
- respect
core.hooksPath - client-side hooks for checkout, commit, rebase, merge, am and push
- receive-side hooks and
reference-transaction
- respect
- refs
- run transaction hooks and handle special repository states like quarantine
- support for different backends like
filesandreftable
- main or linked worktree
- add files with
.gitignorehandling - checkout with conversions like clean + smudge as in
.gitattributes - diff index with working tree
- sparse checkout support
- read per-worktree config if
extensions.worktreeConfigis enabled. - index
- tree from index
- index from tree
- add files with
- worktrees
- open a repository with worktrees
- read locked state
- obtain 'prunable' information
- proper handling of worktree related refs
- create a byte stream and create archives for such a stream, including worktree filters and conversions
- create, move, remove, and repair
- access exclude information
- access attribute information
- respect
core.worktreeconfiguration- deviation
- The delicate interplay between
GIT_COMMON_DIRandGIT_WORK_TREEisn't implemented.
- The delicate interplay between
- deviation
- open a repository with worktrees
- config
- read the primitive types
boolean,integer,string - read and interpolate trusted paths
- low-level API for more elaborate access to all details of
git-configfiles - a way to make changes to individual configuration files in memory
- write configuration back
- auto-refresh configuration values after they changed on disk
- facilities to apply the url-match algorithm and to normalize urls before comparison.
- read the primitive types
- mailmap
- object replacements (
git replace) - read git configuration
- merging
- stashing
- Use Commit Graph to speed up certain queries
- subtree
- interactive rebase status/manipulation
- submodules
- handle 'old' form for reading and detect old form
- list
- edit
- discovery
- API documentation
- Some examples
gix-actor
- read and write a signature that uniquely identifies an actor within a git repository
- a way to parse
name <email>tuples (instead of full signatures) to facilitate parsing commit trailers. - a way to write only actors, useful for commit trailers.
gix-hash
- types to represent hash digests to identify git objects.
- used to abstract over different kinds of hashes, like SHA1 and the upcoming SHA256
- API documentation
- Some examples
gix-chunk
- decode the chunk file table of contents and provide convenient API
- write the table of contents
gix-hashtable
- hashmap
- hashset
gix-utils
- filesystem
- probe capabilities
- symlink creation and removal
- file snapshots
- BString Interner with Arena-Backing and arbitrary value association
- probably based on
internment, but needsbumpalosupport to avoid item allocations/boxing, and avoid internalMutex. (key type is pointer based).
- probably based on
gix-fs
- probe capabilities
- symlink creation and removal
- file snapshots
- stack abstraction
gix-object
- decode (zero-copy) borrowed objects
- commit
- parse trailers
- tree
- commit
- encode owned objects
- commit
- tree
- tag
- [name validation][tagname-validation]
- transform borrowed to owned objects
- edit trees efficiently and write changes back
- See if
gix-fs::InternedMapimproves performance.
- See if
- API documentation
- Some examples
gix-pack
- packs
- traverse pack index
- 'object' abstraction
- decode (zero copy)
- verify checksum
- simple and fast pack traversal
- decode
- full objects
- deltified objects
- decode
- decode a pack from
Readinput- Add support for zlib-ng for 20% faster decompression performance
-
ReadtoIteratorof entries- read as is, verify hash, and restore partial packs
- create index from pack alone (much faster than git)
- resolve 'thin' packs
- decode a pack from
- encode
- Add support for zlib-ng for 2.5x compression performance
- objects to entries iterator
- input objects as-is
- pack only changed objects as derived from input
- base object compression
- delta compression
- respect the
delta=falseattribute
- respect the
- create 'thin' pack, i.e. deltas that are based on objects the other side has.
- parallel implementation that scales perfectly
- entries to pack data iterator
- write index along with the new pack
- verify pack with statistics
- brute force - less memory
- indexed - optimal speed, but more memory
- advanced
- Multi-Pack index file (MIDX)
- read
- write
- verify
- 'bitmap' file
- promisor-aware maintenance and repack behavior
- special handling for networked packs
- detect and retry packed object reading
- Multi-Pack index file (MIDX)
- API documentation
- Some examples
gix-odb
- loose object store
- traverse
- read
- into memory
- streaming
- verify checksum
- streaming write for blobs
- buffer write for small in-memory objects/non-blobs to bring IO down to open-read-close == 3 syscalls
- read object header (size + kind) without full decompression
- dynamic store
- auto-refresh of on-disk state
- handles alternates
- multi-pack indices
- perfect scaling with cores
- support for pack caches, object caches and MRU for best per-thread performance.
- prefix/short-id lookup, with optional listing of ambiguous objects.
- object replacements (
git replace) - high-speed packed object traversal without wasted CPU time
- user defined filters
- read object header (size + kind) without full decompression
- sink
- write objects and obtain id
- alternates
- resolve links between object databases
- safe with cycles and recursive configurations
- multi-line with comments and quotes
- promisor
- mark promisor packs and remember their source remote
- fetch missing objects on demand from promisor remotes
- support multiple promisor remotes and
extensions.partialClone - make object lookups, maintenance and connectivity checks promisor-aware
- API documentation
- Some examples
gix-diff
Check out the performance discussion as well.
- tree
- changes needed to obtain other tree
- blobs
- patches
- There are various ways to generate a patch from two blobs.
- text
- binary
-
git-applycompatibility - merge hunks that are close enough based on line-setting (
interhunk-lines) - white-space related settings
- lines
- Simple line-by-line diffs powered by the
imara-diffcrate.
- Simple line-by-line diffs powered by the
- patches
- generic rename tracker to find renames and copies
- find blobs by exact match
- find blobs by similarity check
- heuristics to find best candidate
- find by basename to support similarity check
- Not having it can lead to issues when files with the same or similar content are part of a move as files can be lost that way.
- directory tracking
- by identity
- by similarity
- blob
- a choice of to-worktree, to-git and to-worktree-if-needed conversions
-
textconvfilters - special handling of files beyond the big-file threshold.
- detection of binary files by looking at header (first 8k bytes)
- caching of diff-able data
- prepare invocation of external diff program
- pass meta-info
- working with hunks of data
- diff-heuristics match Git perfectly
- API documentation
- Examples
gix-merge
- three-way content-merge analysis of blobs with choice of how to resolve conflicts
- respect git attributes and drivers.
- choose how to resolve conflicts on the data-structure
- more efficient handling of paths with
merge=binaryattributes (do not load them into memory) - produce a new blob based on data-structure containing possible resolutions
-
mergestyle -
diff3style -
zdiffstyle
-
- various newlines-related options during the merge (see https://git-scm.com/docs/git-merge#Documentation/git-merge.txt-ignore-space-change).
- a way to control inter-hunk merging based on proximity (maybe via
gix-difffeature which could use the same)
- tree-diff-heuristics match Git for its test-cases
- a way to generate an index with stages, mostly conforming with Git.
- resolve to be ours or the ancestors version of the tree.
- submodule merges (right now they count as conflicts if they differ)
- assure sparse indices are handled correctly during application - right now we refuse.
- rewrite so that the whole logic can be proven to be correct - it's too insane now and probably has way more possible states than are tested, despite best attempts.
- commits - with handling of multiple merge bases by recursive merge-base merge
- persist merge-in-progress state compatible with
MERGE_HEAD,MERGE_MSGandMERGE_MODE - support merge continuation and abort flows as used by
git merge --continueandgit merge --abort - API documentation
- Examples
gix-blame
- commit-annotations for a single file
- progress
- interruptibility
- streaming
- support for worktree changes (creates virtual commit on top of
HEAD) - shallow-history support
- rename tracking (track different paths through history)
- commits to ignore
- pass all blame-cornercases (from Git)
- Performance-Improvements
- Without the following the performance isn't competitive with Git.
- Implement custom graph walk which won't run down parents that don't have the path in question.
- Implement access of trees from commit-graph and fill that information into the traversal info by default.
- commit-graph with bloom filter, used to quickly check if a commit has a path.
- API documentation
- Examples
gix-traverse
Check out the performance discussion as well.
- trees
- nested traversal
- commits
- ancestor graph traversal similar to
git revlog - (performance) stop descending hidden ancestry early instead of prepainting it all
-
commitgraphsupport
- ancestor graph traversal similar to
- API documentation
- Examples
gix-shallow
A utility crate with types and functionality related to shallow-file handling.
gix-url
- As documented here: https://www.git-scm.com/docs/git-clone#_git_urls
- parse
- ssh URLs and SCP like syntax
- file, git, and SSH
- paths (OS paths, without need for UTF-8)
- username expansion for ssh and git urls
- convert URL to string
- API documentation
- Some examples
gix-packetline
- PKT-Line
- encode
- decode (zero-copy)
- error line
- V2 additions
- sideband mode
-
Readfrom packet line with (optional) progress support via sidebands -
Writewith built-in packet line encoding -
asyncsupport - API documentation
- Some examples
gix-transport
- No matter what we do here, timeouts must be supported to prevent hanging forever and to make interrupts destructor-safe.
- client
- general purpose
connect(…)for clients- file:// launches service application
- file:// without launching
git-upload-pack/git-receive-pack - ssh:// launches service application in a remote shell using ssh
- ssh:// without an external
sshbinary - git:// establishes a tcp connection to a git daemon
- http(s):// establishes connections to web server
- via
curl(blocking only) - via
reqwest(blocking only)
- via
- pass context for scheme specific configuration, like timeouts
- git://
- V1 handshake
- send values + receive data with sidebands
-
support for receiving 'shallow' refs in case the remote repository is shallow itself (I presume)- Since V2 doesn't seem to support that, let's skip this until there is an actual need. No completionist :D
- V2 handshake
- send command request, receive response with sideband support
- V1 handshake
- http(s)://
- set identity for basic authentication
- general purpose
Lines 1–500 of 1087. Load more
### gitoxide **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`. * **the `ein` program** - convenient and for humans * [x] **init** - initialize a new non-bare repository with a `main` branch * [ ] **clone** - initialize a local copy of a remote repository * **tools** * [x] **organize** - find all git repositories and place them in directories according to their remote paths * [x] **find** - find all git repositories in a given directory - useful for tools like [skim][skim] * [x] **estimate-hours** - estimate the time invested into a repository by evaluating commit dates. * Based on the [git-hours] algorithm. * See the [discussion][git-hours-discussion] for some performance data. * **the `gix` program** _(plumbing)_ - lower level commands for use during development - As its main purpose is to help running the latest improvements in the real world, it's self-documenting without duplicating its features here. Use `gix --help` to start discovery. [skim]: https://github.com/lotabout/skim [git-hours]: https://github.com/kimmobrunfeldt/git-hours/blob/8aaeee237cb9d9028e7a2592a25ad8468b1f45e4/index.js#L114-L143 [git-hours-discussion]: https://github.com/GitoxideLabs/gitoxide/discussions/78 ### Plumbing Workflow Overview 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. * **workflows already supported in plumbing** * [x] `clone`, `fetch`, `ls-refs` and shallow variants * [x] `commit` and low-level ref/object/index mutation * [x] `status` and worktree-vs-index comparison * [x] blob and tree diffing - mainly `gix-diff` and `gix` * [x] `merge-base`, revision parsing and commit description * [x] worktree streaming, archive creation and low-level checkout * **common workflows that still need plumbing across crates** * [ ] `checkout`, `switch`, `restore` and `reset` - mainly `gix`, `gix-worktree-state`, `gix-index`, `gix-filter`, `gix-hook` * [ ] `merge`, `cherry-pick` and `revert` - mainly `gix`, `gix-merge`, `gix-cherry-pick`, `gix-sequencer`, `gix-rerere`, `gix-hook` * [ ] `rebase` - mainly `gix-rebase`, `gix-sequencer`, `gix-merge`, `gix-apply`, `gix-rerere`, `gix-hook`, `gix` * [ ] `bisect` - mainly `gix-bisect`, `gix-sequencer`, `gix-revision`, `gix-revwalk`, `gix-traverse`, `gix` * [ ] `stash`, `am` and `apply` - mainly `gix-stash`, `gix-apply`, `gix-mailbox`, `gix`, `gix-diff`, `gix-worktree-state`, `gix-sequencer`, `gix-rerere` * [ ] `push` and self-contained clone/fetch over `file://` and `ssh://` - mainly `gix`, `gix-protocol`, `gix-transport`, `gix-ssh` * **cross-cutting parity work** * [ ] hook discovery and execution - mainly `gix-hook`, `gix`, `gix-ref`, `gix-protocol` * [ ] Git 3.0 compatibility (`SHA-256`, `reftable`) - mainly `gix-hash`, `gix-ref`, `gix-reftable`, `gix-protocol`, `gix-odb` * [ ] partial clone, promisor and bundle bootstrapping - mainly `gix-odb`, `gix-pack`, `gix-bundle`, `gix-protocol`, `gix` * [ ] big-repo accelerators (`commit-graph`, bitmaps, split-index, sparse-index, fsmonitor, untracked-cache) - mainly `gix-commitgraph`, `gix-pack`, `gix-index`, `gix-status`, `gix-dir` * [ ] incremental ancestry exclusion during commit iteration - mainly `gix-revwalk`, `gix-traverse`, `gix-revision`, `gix-commitgraph` ### gix The top-level crate that acts as hub to all functionality provided by the `gix-*` plumbing crates. * [x] utilities for applications to make long running operations interruptible gracefully and to support timeouts in servers. * [x] handle `core.repositoryFormatVersion` and extensions * [x] support for unicode-precomposition of command-line arguments (needs explicit use in parent application) * [ ] strict object creation (validate objects referenced by newly created objects exist) * [ ] strict hash verification (validate that objects actually have the hashes they claim to have) * **workflow composition** * [ ] checkout, switch, restore and reset orchestration over refs, index and worktree mutation * [ ] merge workflow orchestration * [ ] persist and resume conflicted merges with [`MERGE_HEAD`](https://git-scm.com/docs/gitrepository-layout), [`MERGE_MSG`](https://git-scm.com/docs/git-merge) and [`MERGE_MODE`](https://github.com/git/git/blob/ce74208c2fa13943fffa58f168ac27a76d0eb789/path.c#L1585) compatible state * [ ] rebase workflow orchestration * [ ] cherry-pick and revert workflow orchestration * [ ] bisect workflow orchestration * [ ] stash workflow orchestration * [ ] `git am` and `git apply` workflow orchestration * [ ] connect mailbox ingestion, patch application, hook execution and resulting commit creation * **Repository** * [x] discovery * [x] option to not cross file systems (default) * [x] handle git-common-dir * [x] support for `GIT_CEILING_DIRECTORIES` environment variable * [ ] handle other non-discovery modes and provide control over environment variable usage required in applications * [x] rev-parse - [ ] handle relative paths as relative to working directory - [x] handle `upstream` and `push` resolution. * [x] rev-walk * [x] include tips * [x] exclude commits * [x] instantiation * [x] access to refs and objects * [x] create a pathspec-search from a set of strings - [ ] allow to construct Pathspecs using data structure instead of enforcing them to be passed as strings. * **credentials** * [x] run `git credential` directly * [x] use credential helper configuration and to obtain credentials with `gix_credentials::helper::Cascade` * **traverse** * [x] commit graphs * [ ] make [git-notes](https://git-scm.com/docs/git-notes) accessible * [x] tree entries * **diffs/changes** * [x] tree with other tree * [x] respect case-sensitivity of host filesystem. * [x] a way to access various diff related settings or use them * [x] respect `diff.*.textconv`, `diff.*.cachetextconv` and external diff viewers with `diff.*.command`, [along with support for reading `diff` gitattributes](https://github.com/git/git/blob/73876f4861cd3d187a4682290ab75c9dccadbc56/Documentation/gitattributes.txt#L699:L699). * **rewrite tracking** * **deviation** - git keeps up to four candidates whereas we use the first-found candidate that matches the similarity percentage. This can lead to different sources being found. As such, we also don't consider the filename at all. * [x] handle binary files correctly, and apply filters for that matter * [x] computation limit with observable reduction of precision when it is hit, for copies and renames separately * **by identity** * [x] renames (sym-links are only ever compared by identity) * [x] copies * **by similarity** - similarity factor controllable separately from renames * [x] renames * [x] copies * [x] 'find-copies-harder' - find copies with the source being the entire tree. * [x] tree or index with working tree - [x] rename tracking - [x] submodule status (recursive) * [x] diffs between modified blobs with various algorithms * [ ] tree with index (via index-from-tree and index) - [ ] rename tracking - [ ] submodule status (recursive) * [x] initialize * [x] Proper configuration depending on platform (e.g. ignorecase, filemode, …) * **Id** * [x] short hashes with detection of ambiguity. * **Commit** * [x] `git describe` like functionality, with optional commit-graph acceleration * [x] create new commit from tree * **Objects** * [x] lookup * [x] peel to object kind * [ ] create [signed commits and tags](https://github.com/GitoxideLabs/gitoxide/issues/12) * **trees** * [x] lookup path * [x] edit * **references** * [x] peel to end * [x] ref-log access * [x] remote name * [x] find remote itself - [ ] respect `branch.<name>.merge` in the returned remote. * **remotes** * [x] clone * [x] shallow * [ ] include-tags when shallow is used (needs separate fetch) * [ ] prune non-existing shallow commits * [ ] [bundles](https://git-scm.com/docs/git-bundle) * [x] fetch * [x] shallow (remains shallow, options to adjust shallow boundary) * [ ] a way to auto-explode small packs to avoid them to pile up * [x] 'ref-in-want' * [ ] 'wanted-ref' * [x] standard negotiation algorithms `consecutive`, `skipping` and `noop`. * [ ] push * [x] ls-refs * [x] ls-refs with ref-spec filter * [x] list, find by name * [x] create in memory * [ ] save to configuration on disk * [ ] write [`FETCH_HEAD`](https://git-scm.com/docs/gitrepository-layout) * [x] apply transport and remote configuration from `git-config`, including `http.*` * [ ] groups * [ ] [remote and branch files](https://github.com/git/git/blob/master/remote.c#L300) * [ ] execute hooks * [ ] respect [`core.hooksPath`](https://git-scm.com/docs/git-config#Documentation/git-config.txt-corehooksPath) * [ ] client-side hooks for checkout, commit, rebase, merge, am and push * [ ] receive-side hooks and [`reference-transaction`](https://git-scm.com/docs/githooks#_reference_transaction) * **refs** * [ ] run transaction hooks and handle special repository states like quarantine * [ ] support for different backends like `files` and `reftable` * **main or linked worktree** * [ ] add files with `.gitignore` handling * [ ] checkout with conversions like clean + smudge as in `.gitattributes` * [ ] _diff_ index with working tree * [ ] sparse checkout support * [x] read per-worktree config if `extensions.worktreeConfig` is enabled. * **index** * [ ] tree from index * [x] index from tree * **worktrees** * [x] open a repository with worktrees * [x] read locked state * [ ] obtain 'prunable' information * [x] proper handling of worktree related refs * [x] create a byte stream and create archives for such a stream, including worktree filters and conversions * [ ] create, move, remove, and repair * [x] access exclude information * [x] access attribute information * [x] respect `core.worktree` configuration - **deviation** * The delicate interplay between `GIT_COMMON_DIR` and `GIT_WORK_TREE` isn't implemented. * **config** * [x] read the primitive types `boolean`, `integer`, `string` * [x] read and interpolate trusted paths * [x] low-level API for more elaborate access to all details of `git-config` files * [ ] a way to make changes to individual configuration files in memory * [ ] write configuration back * [ ] auto-refresh configuration values after they changed on disk * [ ] facilities to apply the [url-match](https://git-scm.com/docs/git-config#Documentation/git-config.txt-httplturlgt) algorithm and to [normalize urls](https://github.com/git/git/blob/be1a02a17ede4082a86dfbfee0f54f345e8b43ac/urlmatch.c#L109:L109) before comparison. * [x] mailmap * [x] object replacements (`git replace`) * [x] read git configuration * [ ] merging * [ ] stashing * [ ] Use _Commit Graph_ to speed up certain queries * [ ] subtree * [ ] interactive rebase status/manipulation * **submodules** * [x] handle 'old' form for reading and detect old form * [x] list * [ ] edit * [x] API documentation * [ ] Some examples ### gix-actor * [x] read and write a signature that uniquely identifies an actor within a git repository * [x] a way to parse `name <email>` tuples (instead of full signatures) to facilitate parsing commit trailers. * [x] a way to write only actors, useful for commit trailers. ### gix-hash * types to represent hash digests to identify git objects. * used to abstract over different kinds of hashes, like SHA1 and the upcoming SHA256 * [x] API documentation * [x] Some examples ### gix-chunk * [x] decode the chunk file table of contents and provide convenient API * [x] write the table of contents ### gix-hashtable * [x] hashmap * [x] hashset ### gix-utils * **filesystem** * [x] probe capabilities * [x] symlink creation and removal * [x] file snapshots * [ ] **BString Interner with Arena-Backing and arbitrary value association** - probably based on [`internment`](https://docs.rs/internment/latest/internment/struct.Arena.html#), but needs `bumpalo` support to avoid item allocations/boxing, and avoid internal `Mutex`. (key type is pointer based). ### gix-fs * [x] probe capabilities * [x] symlink creation and removal * [x] file snapshots * [x] stack abstraction ### gix-object * *decode (zero-copy)* borrowed objects * [x] commit * [ ] parse [trailers](https://git-scm.com/docs/git-interpret-trailers#_description) * [x] tree * encode owned objects * [x] commit * [x] tree * [x] tag * [x] [name validation][tagname-validation] * [x] transform borrowed to owned objects * [x] edit trees efficiently and write changes back - [ ] See if `gix-fs::InternedMap` improves performance. * [x] API documentation * [x] Some examples ### gix-pack * **packs** * [x] traverse pack index * [x] 'object' abstraction * [x] decode (zero copy) * [x] verify checksum * [x] simple and fast pack traversal * [x] decode * [x] full objects * [x] deltified objects * **decode** * _decode a pack from `Read` input_ * [x] Add support for zlib-ng for 20% faster _decompression_ performance * [x] `Read` to `Iterator` of entries * _read as is, verify hash, and restore partial packs_ * [x] create index from pack alone (_much faster than git_) * [x] resolve 'thin' packs * **encode** * [x] Add support for zlib-ng for 2.5x _compression_ performance * [x] objects to entries iterator * [x] input objects as-is * [x] pack only changed objects as derived from input * [x] base object compression * [ ] delta compression * [ ] respect the `delta=false` attribute * [x] create 'thin' pack, i.e. deltas that are based on objects the other side has. * [x] parallel implementation that scales perfectly * [x] entries to pack data iterator * [ ] write index along with the new pack * [x] **verify** pack with statistics * [x] brute force - less memory * [x] indexed - optimal speed, but more memory * **advanced** * [x] Multi-Pack index file (MIDX) * [x] read * [x] write * [x] verify * [ ] 'bitmap' file * [ ] promisor-aware maintenance and repack behavior * [ ] [special handling for networked packs](https://github.com/git/git/blob/89b43f80a514aee58b662ad606e6352e03eaeee4/packfile.c#L949:L949) * [ ] [detect and retry packed object reading](https://github.com/git/git/blob/89b43f80a514aee58b662ad606e6352e03eaeee4/packfile.c#L1268:L1268) * [x] API documentation * [x] Some examples ### gix-odb * **loose object store** * [x] traverse * [x] read * [x] into memory * [x] streaming * [x] verify checksum * [x] streaming write for blobs * [x] buffer write for small in-memory objects/non-blobs to bring IO down to open-read-close == 3 syscalls * [ ] read object header (size + kind) without full decompression * **dynamic store** * [x] auto-refresh of on-disk state * [x] handles alternates * [x] multi-pack indices * [x] perfect scaling with cores * [x] support for pack caches, object caches and MRU for best per-thread performance. * [x] prefix/short-id lookup, with optional listing of ambiguous objects. * [x] object replacements (`git replace`) * [x] high-speed packed object traversal without wasted CPU time - [ ] user defined filters * [ ] read object header (size + kind) without full decompression * **sink** * [x] write objects and obtain id * **alternates** * _resolve links between object databases_ * [x] safe with cycles and recursive configurations * [x] multi-line with comments and quotes * **promisor** * [ ] mark promisor packs and remember their source remote * [ ] fetch missing objects on demand from promisor remotes * [ ] support multiple promisor remotes and `extensions.partialClone` * [ ] make object lookups, maintenance and connectivity checks promisor-aware * [x] API documentation * [x] Some examples ### gix-diff Check out the [performance discussion][gix-diff-performance] as well. * **tree** * [x] changes needed to obtain _other tree_ * **blobs** * **patches** * There are various ways to generate a patch from two blobs. * [ ] text * [ ] binary * [ ] `git-apply` compatibility * [ ] merge hunks that are close enough based on line-setting (`interhunk-lines`) * [ ] white-space related settings * **lines** * [x] Simple line-by-line diffs powered by the `imara-diff` crate. * **generic rename tracker to find renames and copies** * [x] find blobs by exact match * [x] find blobs by similarity check * [ ] heuristics to find best candidate * [ ] find by basename to support similarity check - Not having it can lead to issues when files with the same or similar content are part of a move as files can be lost that way. * [x] directory tracking - [x] by identity - [ ] by similarity * **blob** * [x] a choice of to-worktree, to-git and to-worktree-if-needed conversions * [x] `textconv` filters * [x] special handling of files beyond the big-file threshold. * [x] detection of binary files by looking at header (first 8k bytes) * [x] caching of diff-able data * [x] prepare invocation of external diff program - [ ] pass meta-info * [ ] working with hunks of data * [ ] diff-heuristics match Git perfectly * [x] API documentation * [ ] Examples [gix-diff-performance]: https://github.com/GitoxideLabs/gitoxide/discussions/74 ### gix-merge * [x] three-way content-merge analysis of **blobs** with choice of how to resolve conflicts - [x] respect git attributes and drivers. - [ ] choose how to resolve conflicts on the data-structure - [ ] more efficient handling of paths with `merge=binary` attributes (do not load them into memory) - [x] produce a new blob based on data-structure containing possible resolutions - [x] `merge` style - [x] `diff3` style - [x] `zdiff` style - [ ] various newlines-related options during the merge (see https://git-scm.com/docs/git-merge#Documentation/git-merge.txt-ignore-space-change). - [ ] a way to control inter-hunk merging based on proximity (maybe via `gix-diff` feature which could use the same) * [x] **tree**-diff-heuristics match Git for its test-cases - [x] a way to generate an index with stages, mostly conforming with Git. - [ ] resolve to be *ours* or the *ancestors* version of the tree. - [ ] submodule merges (*right now they count as conflicts if they differ*) - [ ] assure sparse indices are handled correctly during application - right now we refuse. - [ ] rewrite so that the whole logic can be proven to be correct - it's too insane now and probably has way more possible states than are tested, despite best attempts. * [x] **commits** - with handling of multiple merge bases by recursive merge-base merge * [ ] persist merge-in-progress state compatible with [`MERGE_HEAD`](https://git-scm.com/docs/gitrepository-layout), [`MERGE_MSG`](https://git-scm.com/docs/git-merge) and [`MERGE_MODE`](https://github.com/git/git/blob/ce74208c2fa13943fffa58f168ac27a76d0eb789/path.c#L1585) * [ ] support merge continuation and abort flows as used by [`git merge --continue`](https://git-scm.com/docs/git-merge) and [`git merge --abort`](https://git-scm.com/docs/git-merge) * [x] API documentation * [ ] Examples ### gix-blame * [x] commit-annotations for a single file - [ ] progress - [ ] interruptibility - [ ] streaming - [ ] support for worktree changes (creates virtual commit on top of `HEAD`) - [ ] shallow-history support - [ ] rename tracking (track different paths through history) - [ ] commits to ignore - [ ] pass all blame-cornercases (from Git) * **Performance-Improvements** * Without the following the performance isn't competitive with Git. 1. Implement custom graph walk which won't run down parents that don't have the path in question. 2. Implement access of trees from commit-graph and fill that information into the traversal info by default. 3. commit-graph with bloom filter, used to quickly check if a commit has a path. * [x] API documentation * [ ] Examples ### gix-traverse Check out the [performance discussion][gix-traverse-performance] as well. * **trees** * [x] nested traversal * **commits** * [x] ancestor graph traversal similar to `git revlog` * [ ] (performance) stop descending hidden ancestry early instead of prepainting it all * [ ] `commitgraph` support * [x] API documentation * [ ] Examples [gix-traverse-performance]: https://github.com/GitoxideLabs/gitoxide/discussions/76 ### gix-shallow A utility crate with types and functionality related to shallow-file handling. ### gix-url * As documented here: https://www.git-scm.com/docs/git-clone#_git_urls * **parse** * [x] ssh URLs and SCP like syntax * [x] file, git, and SSH * [x] paths (OS paths, without need for UTF-8) * [x] username expansion for ssh and git urls * [x] convert URL to string * [x] API documentation * [x] Some examples ### gix-packetline * [PKT-Line](https://github.com/git/git/blob/master/Documentation/technical/protocol-common.txt#L52:L52) * [x] encode * [x] decode (zero-copy) * [x] [error line](https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L28:L28) * [x] [V2 additions](https://github.com/git/git/blob/master/Documentation/technical/protocol-v2.txt#L35:L36) * [x] [sideband mode](https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L467:L467) * [x] `Read` from packet line with (optional) progress support via sidebands * [x] `Write` with built-in packet line encoding * [x] `async` support * [x] API documentation * [x] Some examples ### gix-transport * No matter what we do here, timeouts must be supported to prevent hanging forever and to make interrupts destructor-safe. * **client** * [x] general purpose `connect(…)` for clients * [x] _file://_ launches service application * [ ] _file://_ without launching `git-upload-pack` / `git-receive-pack` * [x] _ssh://_ launches service application in a remote shell using _ssh_ * [ ] _ssh://_ without an external `ssh` binary * [x] _git://_ establishes a tcp connection to a git daemon * [x] _http(s)://_ establishes connections to web server * [x] via `curl` (blocking only) * [x] via `reqwest` (blocking only) * [ ] pass context for scheme specific configuration, like timeouts * [x] git://<service> * [x] V1 handshake * [x] send values + receive data with sidebands * [ ] ~~support for receiving 'shallow' refs in case the remote repository is shallow itself (I presume)~~ * Since V2 doesn't seem to support that, let's skip this until there is an actual need. No completionist :D * [x] V2 handshake * [x] send command request, receive response with sideband support * [x] http(s)://<service> * [x] set identity for basic authentication