Multi-Repo Git CLI
May 2026
fleet
A zero-dependency CLI that keeps dozens of git repos in sync and spins up disposable, multi-repo task workspaces with a single command. Parallel fast-forward pulls plus git-worktree task workspaces, with the standard library and git as the entire stack.
The one-liner everyone keeps rewriting
If you've got more than a few git repos on your machine, you've definitely typed this at some point:
for d in *; do (cd "$d" && git pull); done
And then typed it again the next week, because of course you didn't save it anywhere. And it pulled everything one repo at a time while you sat there watching. My code folder had slowly turned into a few dozen repos, and I was sick of that loop, sick of not even remembering which ones I cared about keeping updated, and really sick of rebuilding an editor workspace by hand every time a task touched more than one of them.
So I made fleet. It's a little CLI that treats a folder full of repos like something you can actually manage.
What it does
fleet sync pulls everything at once, with retries and timeouts and a tidy summary
at the end instead of a screen full of scrolling text. fleet scan looks at what's
on disk and writes it all down, and it remembers the repos you told it to skip so
you're not re-skipping them forever.
The part I use most is fleet task new. It spins up a throwaway workspace across
several repos using git worktrees: one command, one shared branch on each repo, a
scratch folder, and a clean teardown when you're done. Then fleet open just drops
you in with the editor already up.
It's one Python package and one PowerShell module, and it has zero dependencies. Just the standard library and git. I've got a soft spot for tools that don't make you install half the internet before they'll pull a single repo.
A quick war story
PowerShell and I fell out a bit on this one. It has this lovely habit where, if you
return a list with one item in it, it quietly turns that list into a plain string.
So my code expected a list with one path, got a string, then grabbed the first
character of that string, which happened to be the C from a C:\ path. And then
it tried to run a program just called C.
Took me embarrassingly long to figure out why fleet was convinced my hard drive was a command. Forcing it to hang onto an actual array fixed it. I don't really trust single-item lists anymore.