- Rust 98.7%
- CSS 0.5%
- Meson 0.4%
- Nix 0.3%
|
Christian Kruse
734cf49d5e
macOS: also set gettext path dynamically
in an application bundle, set the gettext path dynamically. Regarding #47 |
||
|---|---|---|
| data | fix: ignore aliases and credential helpers in flatpak | |
| po | add merge UI | |
| scripts | ||
| src | macOS: also set gettext path dynamically | |
| .envrc | ||
| .gitignore | ||
| .rustfmt.toml | ||
| cargo-sources.json | update deps | |
| Cargo.lock | update deps | |
| Cargo.toml | use a text view with a gutter now for displaying diffs | |
| COPYING | ||
| de.wwwtech.gitte.json | Build: Remove CARGO_NET_OFFLINE | |
| flake.lock | ||
| flake.nix | ||
| gitte.doap | add a DOAP file | |
| meson.build | ||
| meson.options | ||
| README.md | add a note about the GNOME CoC | |
| SCREENSHOTS.md | ||
Gitte
A GTK4/libadwaita Git client for the GNOME desktop, written in Rust. It is heavily inspired by Git Tower and Magit. The name Gitte is a play on words. It is the diminutive form of the German female first name Brigitte and is pronounced "Git-ty" in English (with a hard G like in GIF).
See SCREENSHOTS.md for more screenshots.
Features
Repository Management
- Add, rename, and remove repositories; initialize new Git repos
- Copy paths or open them in the file manager
- Search across repositories on the start screen
- Configurable sort order (manual, by name, by last opened)
- Open a repository directly from the command line:
gitte <path>focuses an existing window for that repo, or opens it in a new one
Working Copy
- See all changed files with their status (modified, added, deleted, renamed)
- Stage and unstage at the file, hunk, or individual line level
- Discard changes at file, hunk, or line level
- Copy file paths or open them in the file manager
Interactive Diff Viewer
- Syntax-highlighted additions and deletions (green and red)
- Stage, unstage, or discard changes per hunk or per line
- Sticky hunk headers while scrolling
- View diffs for commits and stashes
Commits
- Write commit messages with subject and body
- Amend the last commit
- Browse commit history with pagination
- View commit diffs with tag and upstream markers
- Interactive rebase: squash/fixup, reorder via drag & drop, reword, and drop commits
Branches
- Create, rename, and delete branches
- Checkout local and remote branches
- Track upstream branches with ahead/behind counts
- Smart handling of dirty working directories (stash-before-switch)
- Collapsible branch groups in the sidebar
Tags
- Create lightweight and annotated tags
- Delete tags
- Push tags to remotes (with force push option)
- Multiple sort methods (semver, alphabetical, date) with ascending/descending order
Pull
- Pull from any remote with branch selection
- Fast-forward, merge, and rebase strategies
- Auto-stash uncommitted changes before pulling
- Prune remote tracking branches during pull
- Fetch tags option
- Conflict detection for merge and rebase
Push
- Push to any remote with branch selection
- Set upstream tracking branch automatically
- Force push option (with visual warning)
- Push tags to remotes
- No-op detection to skip redundant pushes
Remotes
- List remotes and their remote-tracking branches
- Push branches with upstream configuration
- Fetch from single or all remotes
- Auto-fetch at configurable intervals
Stashes
- Create stashes (with or without untracked files)
- Apply, pop, and drop stashes
- Inspect stash diffs
Credentials
- SSH key agent support
- HTTP basic auth with secure keychain storage via Secret Service (D-Bus)
UI & Integration
- Built with libadwaita for a modern GNOME look and feel
- Resizable split panes with persistent positions; window size persistence
- Multi-window support
- Gettext-based internationalization (i18n)
Keyboard Shortcuts
| Action | Shortcut |
|---|---|
| New Window | Ctrl+N |
| Search | Ctrl+F |
| Add Repository | Ctrl+Shift+A |
| Preferences | Ctrl+, |
| Quit | Ctrl+Q |
| Fetch | Ctrl+Shift+F |
| Pull | Ctrl+P |
| Push | Ctrl+Shift+P |
| Stash | Ctrl+Shift+S |
| Stash Including Untracked | Ctrl+Shift+U |
| Pop Latest Stash | Ctrl+Shift+O |
| Create Tag | Ctrl+Shift+T |
| Focus Commit Message | Ctrl+Shift+C |
| Commit | Ctrl+Return |
| Stage/Unstage | Space / Return |
| Discard Changes | Delete |
Building
Dependencies
- Rust toolchain (stable)
- GTK 4 (>= 4.16)
- libadwaita (>= 1.6)
- libgit2
- Meson
- Ninja
On Fedora:
sudo dnf install gtk4-devel libadwaita-devel libgit2-devel meson ninja-build
On Arch Linux:
sudo pacman -S gtk4 libadwaita libgit2 meson ninja
or use the community maintained AUR package
yay -S gitte-git
On NixOS (or with Nix):
nix develop
This enters a dev shell with all dependencies provided via flake.nix.
Build & Install
meson setup builddir
meson compile -C builddir
meson install -C builddir
Note:
src/config.rsis generated by Meson fromsrc/config.rs.in. You need to runmeson compileat least once beforecargo checkorcargo buildwill work.
Flatpak
The Flatpak version of Gitte uses the --filesystem=home permission to access Git repositories in your home directory. This means that system-wide configuration files like /etc/gitconfig cannot be read from within the sandbox.
If you need settings from /etc/gitconfig, you can override the Flatpak permissions:
flatpak override --user --filesystem=/etc/gitconfig:ro de.wwwtech.gitte
Alternatively, you can copy the relevant settings into your user-specific ~/.gitconfig.
Using the host's git binary
History-rewriting operations shell out to git. By default Gitte invokes the bundled git inside the sandbox; user and system Git config files are bridged in via env vars so this normally Just Works.
If you'd rather have Gitte run the git installed on the host (for example, to pick up a custom build, host-only hooks, or credential helpers that depend on host services), you need to do two things:
-
Grant the Flatpak permission to spawn host commands:
flatpak override --user --talk-name=org.freedesktop.Flatpak de.wwwtech.gitte⚠️ This permission effectively allows the app to escape the sandbox by spawning arbitrary host processes. Only enable it if you trust the application and understand the implication.
-
Point Gitte at
flatpak-spawnvia dconf (there is no UI for this on purpose):dconf write /de/wwwtech/gitte/git-command "'flatpak-spawn --host git'"The setting takes a single shell-style command line, it's split by
shell-wordsrules. Common values:'git': default, sandbox-internal git'flatpak-spawn --host git': host's git via the Flatpak portal'/path/to/some/custom/git': absolute path to a specific binary
To revert to the default:
dconf reset /de/wwwtech/gitte/git-command
Contributing
Contributions are welcome! Please make sure your code passes cargo clippy without warnings before submitting a pull request. However, code generated fully or partially by Large Language Models (LLMs) such as ChatGPT, Copilot, or similar tools is not accepted. Please ensure that all submitted code is written and understood by you, so it can be properly reviewed and maintained.
Code of Conduct
This project follows the GNOME Code of Conduct.
License
Gitte is licensed under the AGPL-3.0-or-later.