Pullify is a CLI utility for managing multiple Git repositories at once. If you work across directories that each contain several repos, pullify lets you check their status, pull the latest changes, and switch back to trunk — all without cd-ing into each one.
Clone the repository anywhere on your machine:
git clone https://github.com/you/pullify.git ~/tools/pullifyAdd an alias so pullify is available from anywhere:
# In ~/.zshrc or ~/.bashrc or ~/.aliases
alias pullify="~/tools/pullify/pullify"Reload your shell:
# Example for zsh
source ~/.zshrc# 1. Discover repos in a directory and create a config file
pullify init --path ~/Workspace/my-projects
# 2. Check the status of all repos
pullify status --path ~/Workspace/my-projects
# 3. Pull the latest changes for all repos
pullify pull --path ~/Workspace/my-projectsAll commands require the --path flag pointing to the directory that contains your Git repositories. Paths can be absolute or relative to the current working directory.
Scans a directory for Git repositories and generates a configuration file in the repos/ directory (inside your pullify installation). Run this once to get set up.
pullify init --path ~/Workspace/my-projectsThis creates repos/my-projects.txt with one line per discovered repository:
/Users/you/Workspace/my-projects/api:main:
/Users/you/Workspace/my-projects/frontend:main:
/Users/you/Workspace/my-projects/docs:main:
Lists all Git repositories found in the given directory along with their current branch. Unlike status, this doesn't use a config file — it discovers repos on the fly.
pullify scan --path ~/Workspace/my-projectsUseful for a quick look or before running init.
Fetches from remote and shows the current state of every repository in the config file.
pullify status --path ~/Workspace/my-projectsFor each repository you'll see:
| Column | Description |
|---|---|
| Repository | Path to the repo |
| Trunk | The configured trunk branch (e.g. main) |
| Branch | The currently checked-out branch |
| Status | Whether the repo is up to date, behind trunk, or behind origin |
Status indicators:
- ✓ — Up to date
- ✗ — Behind (needs a pull)
- ? — Unknown (couldn't determine)
Pulls the latest changes for all repositories in the config file. Handles both repos on trunk and repos on feature branches.
pullify pull --path ~/Workspace/my-projectsWhat it does per repository:
- On trunk: runs
git pull --rebaseto keep history linear - On a feature branch: merges trunk into the branch, syncs the feature branch with its remote counterpart, and rebases trunk locally
- Uncommitted changes: automatically stashed before the pull and restored afterward (conflicts are flagged)
The summary table shows:
| Column | Description |
|---|---|
| Repository | Path to the repo |
| Trunk | Configured trunk branch |
| Branch | Currently checked-out branch |
| Trunk | Whether trunk was updated (✓ / ✗ / –) |
| Branch | Whether the current branch was updated (✓ / ✗ / –) |
| Stash | Stash result: restored, conflict, or – |
| Result | Overall outcome: up to date, updated, error, or skipped |
Interactively switches selected repositories back to their configured trunk branch.
pullify trunk --path ~/Workspace/my-projectsOnly repos that are not already on trunk are shown. You pick which ones to switch:
- Enter space-separated numbers (e.g.
1 3 5) to select specific repos - Enter
ato switch all of them - Press Enter with no input to cancel
Uncommitted changes are stashed automatically before switching and restored afterward.
Configuration files live in the repos/ directory inside your pullify installation. Each file corresponds to one parent directory and is named after it (e.g. repos/my-projects.txt).
Line format:
<full/path/to/repo>:<trunk-branch>:<skip>
Examples:
/Users/you/Workspace/my-projects/api:main:
/Users/you/Workspace/my-projects/frontend:main:
/Users/you/Workspace/my-projects/legacy-service:master:
/Users/you/Workspace/my-projects/archived-repo:main:skip
| Field | Description |
|---|---|
path |
Absolute path to the repository |
trunk-branch |
The integration branch for this repo (main, master, etc.) |
skip |
Leave blank to include; set to skip to exclude from pull/trunk |
Repos marked skip still appear in status output but are not touched by pull or trunk.
- Edit a config file manually to add, remove, or skip repos without re-running
init. - Use
scanafter adding new repos to a directory to see what's there before updating the config. pullis safe to run even with uncommitted work — changes are stashed and restored automatically.- Trunk branch names can differ per repo (e.g.
mainfor one,masterfor another) — configure them individually in the config file.