Need a per-repo toggle for your own tool? Stash it in `git config`
When you build tooling around git repos, you eventually hit "where do I store a per-repo setting?" Committing a .toolrc pollutes the repo and needs a PR; a sidecar file in ~/.config can't easily be per-repo. The clean answer: put it straight into git config under your own namespace.
# per-repo (lands in <repo>/.git/config — local, never committed)
git config --local mux.adhocWorktree false
# per-machine, all repos (lands in ~/.gitconfig)
git config --global mux.adhocWorktree false
# read it back, normalized to true/false
git config --bool --get mux.adhocWorktree # -> false ; exit 1 if unset
git lets you invent any <section>.<key> it doesn't recognize (mux.* here) and just stores it. That hands you three things for free that you'd otherwise have to build:
- A per-repo store that never leaks —
.git/configis local to the checkout and never committed, so it won't pollute someone else's repo. - Scope layering with native precedence —
--local(repo) transparently overrides--global(machine). Onegit config --getresolves the hierarchy; you don't write any "check repo, then fall back to machine" logic. - Type parsing —
--boolnormalizesfalse/0/no/off→false, and a non-zero exit cleanly signals "not configured" so you can fall through to your built-in default.
So a full precedence chain for a feature flag becomes: CLI flag → env var → git config (local→global) → built-in default — and the middle two scopes are entirely git's job.
One gotcha with worktrees: git config --local writes to the shared common .git/config, not the linked worktree, because worktrees share config. If your setting is meant to key off the main checkout (it usually is), that's exactly right — but don't expect two worktrees of the same repo to hold different --local values.
The decision that surfaced this: an agent launcher was hardwiring a git worktree per session (hundreds of MB on big repos, painful on a VM). The whole "make it opt-out, but where does the per-repo marker live?" problem evaporated the moment we realized git config already is a per-repo + per-machine settings store with precedence baked in.