Move git identity to an included ~/.gitconfig.local

~/.extra ran five `git config --global` writes on every shell startup, to
re-assert identity and signing after bootstrap.sh copies gitconfig over
~/.gitconfig. The dark-mode-notify agent fires on wake/unlock and runs
`pkill -usr1 zsh`, so every shell re-sources .zshrc — and therefore .extra —
simultaneously. `git config` locks with O_EXCL and has no retry or timeout for
config files, so the concurrent writes raced and printed:

    error: could not lock config file /Users/jonny/.gitconfig: File exists

Identity and signing now live in an untracked ~/.gitconfig.local, included
last from gitconfig so it wins over anything above. bootstrap.sh seeds it from
gitconfig.local.template only when absent, so re-runs never clobber the real
signing key. No git writes happen on shell startup at all now.

Verified: fully-resolved config is unchanged apart from the new include.path;
author and committer both resolve from config with no GIT_* env vars set;
existing commits still verify. 12 concurrent sources of .extra are silent,
where the old version produced 27 lock errors.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonny Barnes 2026-08-09 09:57:19 +01:00
commit 583bbaa533
No known key found for this signature in database
3 changed files with 39 additions and 1 deletions

23
gitconfig.local.template Normal file
View file

@ -0,0 +1,23 @@
# Machine-local git config, included from the end of ~/.gitconfig.
#
# This file is NOT tracked in the dotfiles repo — it is per-machine, and holds
# the identity and signing key. bootstrap.sh copies this template into place
# only if ~/.gitconfig.local does not already exist, so your real values are
# never clobbered by a re-run.
#
# Uncomment and fill these in on a new machine. Do not skip this: git will not
# refuse to commit. It auto-derives an identity from your username and hostname
# (e.g. jonny@Jonnys-MacBook.local), prints a "configured automatically"
# warning, exits 0, and does no signing at all.
#[user]
# name = Your Name
# email = you@example.com
# signingkey = ssh-ed25519 AAAA...
#[commit]
# gpgsign = true
# Path to the signing program, if signing SSH-style via a password manager.
#[gpg "ssh"]
# program = /Applications/1Password.app/Contents/MacOS/op-ssh-sign