Make large Git repositories feel instant.
Gity is a lightweight, cross-platform daemon that accelerates Git operations on large repositories. A single binary runs on Linux, macOS, and Windowsβwatching your files, maintaining warm caches, and running background maintenance so git status stays fast even in repos with millions of files.
| Platform | File Watcher | Status |
|---|---|---|
| Linux | inotify | β Full support |
| macOS | FSEvents | β Full support |
| Windows | ReadDirectoryChangesW | β Full support |
| WSL2 | inotify (Linux FS only) |
One binary, same features everywhere. No platform-specific configuration needed.
In large repositories, everyday Git commands become painfully slow:
$ time git status
# ... 8 seconds later ...
nothing to commit, working tree cleanThis happens because Git must scan the entire working tree, check file timestamps, and compare against the index. The larger your repo, the worse it gets.
Gity runs a background daemon that:
- Watches your files β Detects changes instantly via OS-native file watchers (inotify, FSEvents, ReadDirectoryChangesW)
- Tells Git what changed β Implements Git's fsmonitor protocol so Git only checks files that actually changed
- Keeps objects fresh β Runs
git maintenanceduring idle periods so fetches stay fast - Caches results β Remembers status results and serves them instantly when nothing changed
The result: git status in milliseconds instead of seconds.
# Install
cargo install gity
# Register your large repo (one-time setup)
gity register /path/to/large-repo
# That's it! Git commands are now accelerated
cd /path/to/large-repo
git status # Fast!The daemon starts automatically when needed. For manual control:
gity daemon start # Start in background
gity daemon stop # Stop gracefully
gity list # See registered repos
gity health <repo> # Check repo healthcargo install gityWith system tray support:
cargo install gity --features traybrew tap neul-labs/tap
brew install gitynpm install -g gity-cliOr with npx:
npx gity-cli register /path/to/large-repopip install gity- Linux:
.debpackage (see releases) - macOS:
.pkginstaller (see releases) - Windows: MSI installer (see releases)
- Snap:
snap install gity - Chocolatey:
choco install gity
All release artifacts are built and published via GitHub Actions with OIDC-based trusted publishing (no long-lived secrets) and signed attestations:
- crates.io β Published via Trusted Publishing (OIDC)
- PyPI β Published via Trusted Publishing (OIDC)
- npm β Published via Trusted Publishing with automatic provenance attestations
- GitHub Releases β Binaries are attested with
actions/attest-build-provenance
Verify a release binary:
gh attestation verify gity-0.1.2-x86_64-unknown-linux-gnu.tar.gz --owner neul-labsYou work in a large monorepo with thousands of packages. Every git status takes 10+ seconds, breaking your flow.
gity register ~/work/monorepo
cd ~/work/monorepo
git status # Now instantYou have several worktrees of the same repo for parallel feature development.
gity register ~/projects/app
gity register ~/projects/app-feature-x
gity register ~/projects/app-bugfix-y
# Caches are shared between related repos on the same machineYour CI builds clone large repos and run status checks. Use oneshot mode to accelerate without a persistent daemon:
gity daemon oneshot /path/to/repo
git status
git diff --cachedIDEs constantly poll git status for file decorations. With gity, these polls return instantly:
# IDE calls this repeatedly
git status --porcelain # Returns in <10ms with gityβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Your Workflow β
β $ git status β
β β β
β βΌ β
β βββββββββββ "what changed?" βββββββββββββββββββ β
β β Git β ββββββββββββββββββββΊ β gity daemon β β
β β β ββββββββββββββββββββ β β β
β βββββββββββ "only foo.rs" β β’ file watcher β β
β β β β’ dirty cache β β
β βΌ β β’ maintenance β β
β Only scans foo.rs βββββββββββββββββββ β
β instead of 100,000 files β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
When you register a repo, gity:
- Starts watching the working tree for file changes
- Configures Git to use
gity fsmonitor-helperas the fsmonitor - Tracks which files changed since the last query
- Schedules background
git maintenanceduring idle periods
When Git runs git status:
- Git asks the fsmonitor "what changed since token X?"
- Gity returns only the files that actually changed
- Git scans just those files instead of the entire tree
See docs/architecture.md for the full technical deep-dive.
| Command | Description |
|---|---|
gity register <path> |
Start accelerating a repository |
gity unregister <path> |
Stop accelerating and clean up |
gity list [--stats] |
Show registered repos and health |
gity status <path> |
Fast status summary |
gity health <path> |
Detailed diagnostics |
gity prefetch <path> |
Trigger background fetch |
gity maintain <path> |
Trigger maintenance tasks |
gity daemon start |
Start daemon in background |
gity daemon stop |
Stop daemon gracefully |
gity tray |
Launch system tray UI |
See docs/commands.md for complete reference.
- Git 2.37+ (for fsmonitor-watchman protocol v2)
- Rust 1.75+ (to build from source)
- Linux, macOS, or Windows
Gity stores data in $GITY_HOME (defaults to ~/.gity on Unix, %APPDATA%\Gity on Windows):
~/.gity/
βββ data/
β βββ sled/ # Metadata database
β βββ status_cache/ # Cached status results
βββ logs/
βββ daemon.log # Daemon logs
Environment variables:
| Variable | Description | Default |
|---|---|---|
GITY_HOME |
Data directory | ~/.gity |
GITY_DAEMON_ADDR |
IPC address | tcp://127.0.0.1:7557 |
| Document | Description |
|---|---|
| architecture.md | System design, data flow, component details |
| fsmonitor.md | Git fsmonitor integration and edge cases |
| commands.md | Complete CLI reference |
| alternatives.md | Comparison with other approaches |
| process.md | Contributing guidelines |
| release-requirements.md | Release process and OIDC setup |
Check that the repo is registered and healthy:
gity list
gity health /path/to/repoVerify fsmonitor is configured:
git config core.fsmonitor
# Should show: gity fsmonitor-helperCheck logs:
cat ~/.gity/logs/daemon.logVerify the port is available:
lsof -i :7557The file watcher might have missed events (can happen after sleep/hibernate). Force a refresh:
gity health /path/to/repo # Shows if reconciliation is needed
git status # Triggers full scan if neededIf using WSL2, file watching only works for repos on the Linux filesystem:
# Good - works correctly
gity register ~/code/repo
# Bad - inotify doesn't work across 9P filesystem
gity register /mnt/c/Users/me/repoSee docs/fsmonitor.md for details.
- Read docs/process.md for conventions
- Open a draft PR early for feedback
- Run tests:
cargo test --all
MIT