Let's git this bread β tools for developers who knead to understand their git repos
A collection of git utilities, freshly baked in Go. Vibe-coded.
| Package | Tools | Description |
|---|---|---|
| git-explain | git-explain | See contribution status across repositories |
| git-as | git-id, git-as, gh-as | Identity switching for git and GitHub CLI |
| gh-wtfork | gh-wtfork | What the fork? Triage years of GitHub forks |
brew install jdevera/tap/git-this-breadThis installs: git-explain, git-id, git-as, gh-as, gh-wtfork
# Install all at once
git clone https://github.com/jdevera/git-this-bread && cd git-this-bread && go install ./cmd/...
# Or one by one
go install github.com/jdevera/git-this-bread/cmd/git-explain@latest
go install github.com/jdevera/git-this-bread/cmd/git-id@latest
go install github.com/jdevera/git-this-bread/cmd/git-as@latest
go install github.com/jdevera/git-this-bread/cmd/gh-as@latest
go install github.com/jdevera/git-this-bread/cmd/gh-wtfork@latestSee your contribution status across repositories at a glance.
Ever wonder which repos in a folder are yours, which are forks, and which are just clones you grabbed and forgot about? git-explain rises to the occasion.
- π Your commits β how many commits you've made (by matching your
user.email) - π΄ Fork detection β identifies repos where you have an upstream remote
- βοΈ Your remotes β highlights remotes containing your GitHub username
- π Dirty status β staged, modified, untracked files with line counts
- β¬οΈ Unpushed commits β don't leave your dough unproofed
- π¦ Stashes β forgotten stashes you should deal with
Set your git identity so git-explain knows who you are:
git config --global user.email "you@example.com"
git config --global github.user "yourusername"# Analyze all repos in a directory
git explain ~/projects
# Analyze a single repo with verbose output
git explain ~/projects/my-repo -v
# Show as a table
git explain ~/projects -t
# Output as JSON
git explain ~/projects --json
# Get advice on what to do
git explain ~/projects --advice
# Get LLM-powered advice (requires OPENAI_API_KEY or ANTHROPIC_API_KEY)
git explain ~/projects --llm-advice
# Use Anthropic instead of OpenAI
git explain ~/projects --llm-advice --llm-provider anthropic
# Add custom personality to LLM advice
git explain ~/projects --llm-advice --llm-instructions "be encouraging and use baking puns"ο chezmoi ξ₯ master ο origin ο 3 ο³ 2025-11-13 ο modified:1 +21/-0 untracked:3 fork
ο command-launcher ξ₯ main ο origin ο 12 ο³ 2025-10-20 ο modified:1 +2/-0 untracked:3 ο’ 4 unpushed ο 1 stash fork
ο ddns-updater ξ₯ json_api ο origin ο 3 ο³ 2026-01-06 ο untracked:1 ο 1 stash fork
ο ebookatty ξ₯ explicit_cli_output_format ο origin ο 2 ο³ 2026-01-04 fork
ο grc ξ₯ master ο origin ο 1 ο³ 2015-02-03 ο modified:52 +130/-146 ο’ 1 unpushed fork
ο homepage ξ₯ size_formatter ο origin ο 4 ο³ 2024-08-26 fork
ο mirror-to-gitea ξ₯ skip_forks ο origin ο 5 ο³ 2024-07-20 ο untracked:1 fork
ο command-launcher
ξ₯ main
ο Remotes:
origin β git@github.com:jdevera/command-launcher.git (mine)
upstream β git@github.com:criteo/command-launcher.git
ο 12 commits by you
ο³ Last commit: 2025-10-20
ο modified:1 +2/-0 untracked:3
ο’ 4 unpushed
ο 1 stash
Branches with your commits:
β main 10 commits (2025-10-20)
β self_updater_version_compare 7 commits (2025-08-02)
β docs_linting 6 commits (2025-02-20)
β command_name_in_env 5 commits (2024-08-26)
| Flag | Short | Description |
|---|---|---|
--verbose |
-v |
Detailed multi-line output with branches |
--compact |
-c |
One-line output (default for multi-repo) |
--table |
-t |
Compact table view |
--all |
-a |
Include non-git directories |
--json |
Output as JSON | |
--advice |
Show actionable suggestions | |
--llm-advice |
Enable LLM-powered advice (requires API key) | |
--llm-provider |
LLM provider: openai (default), anthropic |
|
--llm-instructions |
Custom instructions for the LLM | |
--no-cache |
Bypass LLM advice cache | |
--per-repo |
Analyze each repo individually with LLM | |
--legend |
-l |
Explain icons and colors |
--quiet |
-q |
Suppress progress output |
Manage git identity profiles for multi-account workflows.
Juggling personal and work GitHub accounts? git-id stores identity profiles in your git config so you can switch contexts without kneading through config files.
Each profile can have:
- π SSH key β path to the private key for this identity
- π§ Email β git author/committer email
- π€ User β git author/committer name
- π GitHub user β username for
gh-as
# List all profiles
git-id
# Create a new profile interactively
git-id add personal
# Show profile details
git-id show personal
# Set a single field
git-id set personal email me@example.com
# Remove a profile
git-id remove personal$ git-id
personal: me@example.com (gh: myuser β)
work: me@company.com (gh: work-user β)
$ git-id show personal
Profile: personal
Source: /Users/me/.gitconfig
sshkey: ~/.ssh/id_personal β
email: me@example.com
user: My Name
ghuser: myuser β authenticated
Run git commands with a specific identity.
Use your identity profiles to run git commands with the right SSH key and email β no more pushing with the wrong account.
# Clone with your personal identity
git-as personal clone git@github.com:user/repo.git
# Push with your work identity
git-as work push origin main
# Commit as a specific identity
git-as personal commit -m "Fix bug"git-as sets environment variables and execs git:
GIT_SSH_COMMANDβ uses the profile's SSH keyGIT_AUTHOR_EMAIL/GIT_COMMITTER_EMAILβ uses the profile's emailGIT_AUTHOR_NAME/GIT_COMMITTER_NAMEβ uses the profile's name (if set)
Run GitHub CLI commands with a specific identity.
Switch between authenticated GitHub accounts for gh commands.
The GitHub user must be authenticated with gh auth login before use.
# List PRs as your personal account
gh-as personal pr list
# Create an issue as your work account
gh-as work issue create
# Clone a repo as a specific user
gh-as personal repo clone owner/repogh-as creates a temporary config directory with a hosts.yml that selects the specified user, then execs gh with GH_CONFIG_DIR pointing to it.
What the fork? Analyze your GitHub forks.
You've accumulated mass amounts of repositories after years of compulsive open source contribution. You no longer know what's yours and what's not. Tell apart the projects you're actively maintaining from that fork you made in 2010 to correct a typo.
gh-wtfork categorizes your forks into three groups:
- Maintained β you're ahead on the default branch (keeping your own version)
- Contributions β not ahead, but has branches or PRs (contributing back upstream)
- Untouched β no changes at all (can probably delete)
For each fork, you'll see:
- How far ahead/behind upstream, and when (is upstream dead? is your fork stale?)
- Your branches with age and associated PR status (open, merged, or closed)
- Whether that old branch is finished business or still pending
# Show active forks (hides untouched ones)
gh-wtfork
# Show all forks including untouched
gh-wtfork --all
# Run as a specific identity
gh-wtfork --as work
# Output as JSON
gh-wtfork --jsonβ Maintained
π΄ jdevera/command-launcher
β criteo/command-launcher
β 12 ahead (3mo ago) β 45 behind (upstream: 2d ago)
β feature-branch 2025-10-20 Β· 4mo ago
π merged #89 Add self-update version comparison
β Contributions
π΄ jdevera/acme.sh
β acmesh-official/acme.sh
β 441 behind (upstream: 2d ago)
β multideploy-yaml 2025-08-31 Β· 6mo ago
π merged #4521 Add multi-deploy YAML support
β patch-1 2025-09-01 Β· 6mo ago
β closed #4530 Fix typo in README
MIT β Do what you want, just don't blame me if your bread burns.