gitdeck is a dependency-free terminal UI for managing multiple Git repositories
under a folder.
It scans a root directory, lists every Git working tree it finds, and lets you refresh status, check remotes, pull, push, commit, fetch, and inspect status/logs for one repository or all repositories.
Recommended from a checkout:
uv run gitdeck /path/to/projectsFor example:
uv run gitdeck ~/gitYou can also run the module directly:
python -m gitdeck /path/to/projectsFrom a checkout:
PYTHONPATH=src python -m gitdeck ~/gitOr install it locally:
python -m pip install -e .
gitdeck ~/git| Key | Action |
|---|---|
q |
Quit |
j / Down |
Move selection down |
k / Up |
Move selection up |
g |
Jump to first repository |
G |
Jump to last repository |
r |
Refresh status for all repositories |
n |
Check selected repository remote reachability |
N |
Check all repository remotes |
s |
Show git status --short --branch for selected repository |
: |
Run a custom Git command in the selected repository |
Enter / v |
View changed files for selected repository |
i |
Create or edit selected repository .gitignore |
l |
Show recent commits for selected repository |
f |
Fetch selected repository |
F |
Fetch all repositories |
p |
Pull selected repository |
P |
Pull all repositories |
u |
Push selected repository |
U |
Push all repositories |
c |
Commit selected repository with git add -A; press p on the result screen to push |
C |
Commit all dirty repositories with git add -A; press p on the result screen to push successful commits |
? |
Show help |
Press Enter on a repository to inspect its changed files. v also works.
| Key | Action |
|---|---|
j / Down |
Move selection down |
k / Up |
Move selection up |
g |
Jump to first file |
G |
Jump to last file |
Space / a |
Stage selected file |
A |
Stage all files in the repository immediately |
x |
Unstage selected file |
X |
Unstage all files in the repository |
c |
Commit this repository with git add -A; press p on the result screen to push |
p |
Pull this repository |
u |
Push this repository |
: |
Run a custom Git command in this repository |
b / r |
Return to repository list |
Bulk commands run sequentially and keep going if one repository fails. The final output is shown in a scrollable detail panel.
Press : on a repository to run an ad-hoc Git command in that repository. You
can type either the arguments or a full git ... command:
status --short
git log --oneline -n 20
diff --stat
The command output opens in gitdeck's scrollable detail view.
Gitdeck reads an optional config file from $GITDECK_CONFIG, or from:
~/.config/gitdeck/config
Create a starter config:
uv run gitdeck --write-configExample:
[keys]
# Uncomment a line to override that action. Values are comma-separated aliases.
# Main view:
# quit = q, Esc
# help = ?
# open-files = Enter, v
# refresh = r
# check-net = n
# check-net-all = N
# status = s
# log = l
# edit-gitignore = i
# fetch = f
# fetch-all = F
# pull = p
# pull-all = P
# push = u
# push-all = U
# commit = c
# commit-all = C
# custom-git-command = :
# Detail/file views:
# back = b, r, Enter
# stage-file = Space, a
# stage-all = A
# unstage-file = x
# unstage-all = X
[colors]
# selected_fg = black
# selected_bg = cyan
# clean = green
# dirty = yellow
# error = red
# title = cyan
# staged = cyan
[scan]
# Empty means unlimited recursive scanning.
# max_depth =
# ignore_dirs = .git, .hg, .svn, node_modules, .venv, venvKey names are comma-separated aliases. Setting an action replaces that action's
defaults, so include every key you want to keep. For example, push = o changes
selected-repository push to o; push-all = U stays separate unless changed.
Common special names are Enter, Esc, Space, Up, Down, Left, Right,
PgUp, and PgDn.
Gitdeck warns about key conflicts within the same screen context. Reusing a key
across different screens is allowed, such as r for refresh in the main view
and back in a detail view.
Available color names are black, red, green, yellow, blue,
magenta, cyan, white, and default. default uses the terminal's
current default color.
| Indicator | Meaning |
|---|---|
| green row | Clean and in sync with upstream |
| yellow row | Has local changes, commits ahead, or commits behind |
| red row | Status error or merge conflicts |
S<n> |
Staged file count |
M<n> |
Modified but unstaged file count |
?<n> |
Untracked file count |
!<n> |
Conflicted file count |
+a/-b |
Commits ahead of / behind upstream |
net ? |
Remote reachability has not been checked yet; press n or N |
<branch> (unborn) |
Repository has no first commit yet |
- Remote reachability uses
git ls-remote --exit-code <remote> HEADwith a short timeout. It is only checked when you pressnorNto avoid slowing normal refreshes. - Commit commands stage all changes in the target repository before committing.
- The
.gitignoreeditor uses$VISUAL, then$EDITOR, thenvi. If the selected repository has no.gitignore, gitdeck creates one from its built-in starter template first. - Nested repositories below a discovered working tree are skipped deliberately;
this avoids descending into submodules or vendored repositories unless you run
gitdeckfrom a narrower root.
