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:
parent
d245a83f2c
commit
583bbaa533
3 changed files with 39 additions and 1 deletions
11
bootstrap.sh
11
bootstrap.sh
|
|
@ -48,10 +48,19 @@ test -L $HOME/.config/nvim/lsp/phpactor.lua || ln -f -s $BASEDIR/neovim/lsp/phpa
|
||||||
test -d $HOME/.claude || mkdir $HOME/.claude
|
test -d $HOME/.claude || mkdir $HOME/.claude
|
||||||
ln -f -s $BASEDIR/claude/statusline.isaacaudet.sh $HOME/.claude/statusline.sh
|
ln -f -s $BASEDIR/claude/statusline.isaacaudet.sh $HOME/.claude/statusline.sh
|
||||||
|
|
||||||
# .gitconfig gets edited by .extra so we won't symlink it, but copy it
|
# Copy rather than symlink, so an ad-hoc `git config --global` writes to $HOME
|
||||||
|
# and not into the repo.
|
||||||
echo "For compatibility we shall copy the global gitconfig"
|
echo "For compatibility we shall copy the global gitconfig"
|
||||||
cp $BASEDIR/gitconfig $HOME/.gitconfig
|
cp $BASEDIR/gitconfig $HOME/.gitconfig
|
||||||
|
|
||||||
|
# Identity and signing live in ~/.gitconfig.local, which the above includes.
|
||||||
|
# It is per-machine and untracked, so seed it from the template. Never
|
||||||
|
# overwrite an existing one: it holds the real signing key.
|
||||||
|
test -e $HOME/.gitconfig.local || {
|
||||||
|
echo "Seeding ~/.gitconfig.local from template — fill in your identity"
|
||||||
|
cp $BASEDIR/gitconfig.local.template $HOME/.gitconfig.local
|
||||||
|
}
|
||||||
|
|
||||||
# Copy the progs into the local bin dir
|
# Copy the progs into the local bin dir
|
||||||
rsync -av --chmod=+x $BASEDIR/bin/ $HOME/.local/bin/
|
rsync -av --chmod=+x $BASEDIR/bin/ $HOME/.local/bin/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,3 +87,9 @@
|
||||||
autoSquash = true
|
autoSquash = true
|
||||||
autoStash = true
|
autoStash = true
|
||||||
updateRefs = true
|
updateRefs = true
|
||||||
|
|
||||||
|
# Machine-local identity and signing config. Untracked, and included last so
|
||||||
|
# it wins over anything above. Keeps `bootstrap.sh`'s copy of this file
|
||||||
|
# non-destructive without needing to re-apply values on every shell startup.
|
||||||
|
[include]
|
||||||
|
path = ~/.gitconfig.local
|
||||||
|
|
|
||||||
23
gitconfig.local.template
Normal file
23
gitconfig.local.template
Normal 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
|
||||||
Loading…
Reference in a new issue