grove · github v0.1.0
grove grove

Status, diffs and logs across every git repository under one directory.

git answers questions about one repository at a time. In a directory holding twenty clones, the useful questions — which have uncommitted work, what branch is each on, what did I touch today — have no answer at all. grove answers them.

~/work .grove.toml
api
auth-service
billing
gateway
web
dashboard
landing
5 repos · 3 dirty3 branches across 5 repos3 repos have changes8 commits since yesterday
one root · four questions
~/work $git statusgrove branchgrove diffgrove log --since yesterday grove status
api
  auth-service  feat/ABC-123-token-refresh  clean  ↑0 ↓0
  billing       develop                     ~4     ↑0 ↓0
  gateway       main                        ~2 ?1  ↑1 ↓0
web
  dashboard     develop                     clean  ↑0 ↓0
  landing       develop                     ~2     ↑0 ↓0

5 repos · 3 dirty · 1 ahead · 0 behind
develop                     api/billing
                            web/dashboard
                            web/landing
feat/ABC-123-token-refresh  api/auth-service
main                        api/gateway
── api/billing ────────────────────────────────────
 internal/invoice/render.go | 18 +++++++++++++-----
 internal/invoice/tax.go    | 12 ++++++------
 internal/ledger/post.go    |  6 +++---
 migrations/0042_credit.sql | 14 ++++++++++++++
 4 files changed, 36 insertions(+), 14 deletions(-)

── api/gateway ───────────────────────────────────
 cmd/gateway/main.go     |  9 ++++++---
 internal/proxy/route.go | 17 +++++++++++------
 2 files changed, 17 insertions(+), 9 deletions(-)

── web/landing ───────────────────────────────────
 src/pages/pricing.tsx | 21 ++++++++++++++-------
 src/styles/tokens.css |  4 ++--
 2 files changed, 16 insertions(+), 9 deletions(-)
9f2ab08  api/billing       aymen  credit notes use ledger currency
3d0c14e  web/landing       aymen  pricing table reads tokens.css
77e1d54  api/gateway       aymen  forward the request id upstream
b02c6aa  api/auth-service  aymen  rotate refresh tokens on reuse
4e8fa13  web/dashboard     aymen  drop the unreadable chart legend
c57b290  api/billing       aymen  credit note migration, forward
08d4e6f  api/gateway       aymen  time out upstreams at 5s
e1a7c34  web/landing       aymen  the hero stops reflowing at 380px

Three of the five have uncommitted work, and gateway is a commit ahead of its remote. One command, every repository.

The same five repositories, grouped by the branch they are on: one ticket branch, in one repository — the rest sit on develop and main.

A diffstat per repository. The two with nothing to show drop out — of the answer, and of the tree beside it.

Every repository's commits, merged into one timeline and sorted by date. --since, --author and -n are git's own.

Inside a grove but outside any repository, plain git status becomes grove status — and the same for diff, fetch, log and branch. It prints the grove command it ran, so nothing happens invisibly. Everywhere else, including inside a clone, git is untouched.

Install

~$curl -LsSf https://grove.aymenkrifa.com/install.sh | sh

Installs grove and git-grove, the shim the wrapper above is built on. Linux and macOS.

What it will not do

grove never changes a working tree. There is no pull, push, checkout or commit; fetch is the only network command and it touches no files. Anything that mutates goes through grove exec, where you type the command yourself and grove only fans it out.