Compare commits

...
Author SHA1 Message Date
Jonny Barnes
583bbaa533
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>
2026-08-09 09:57:19 +01:00
Jonny Barnes
d245a83f2c
Add nvim-tree, on the right, toggled with <leader>e
Netrw is disabled, as nvim-tree needs to own directory buffers so
`nvim .` opens the tree rather than the two fighting over it. That
removes :Ex, so the Obsidian guide has been updated to point at
<leader>e instead.

No auto-open autocmd: `nvim <path>` opens just the file, and the tree
is there on <leader>e when it is wanted. Placing it on the right also
flips the split direction, so opening a file from the tree puts it to
the left rather than displacing the tree.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 20:36:39 +01:00
6 changed files with 56 additions and 1 deletions

View file

@ -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/

View file

@ -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
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

View file

@ -1,4 +1,5 @@
require('config.plugins.fzf-lua') require('config.plugins.fzf-lua')
require('config.plugins.gitsigns') require('config.plugins.gitsigns')
require('config.plugins.nvim-tree')
require('config.plugins.web-devicons') require('config.plugins.web-devicons')
require('config.plugins.which-key') require('config.plugins.which-key')

View file

@ -0,0 +1,12 @@
-- Must be set before netrw loads, which happens after init.lua is sourced.
-- nvim-tree takes over directory buffers, so `nvim .` opens the tree.
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
vim.pack.add({ 'https://github.com/nvim-tree/nvim-tree.lua' })
require('nvim-tree').setup({
view = { side = 'right' },
})
vim.keymap.set('n', '<leader>e', '<Cmd>NvimTreeToggle<CR>', { desc = 'Toggle file tree' })

View file

@ -8,6 +8,10 @@
"rev": "31d6fb2d618bca1482b9f274751ead5f03461408", "rev": "31d6fb2d618bca1482b9f274751ead5f03461408",
"src": "https://github.com/lewis6991/gitsigns.nvim" "src": "https://github.com/lewis6991/gitsigns.nvim"
}, },
"nvim-tree.lua": {
"rev": "b2aadda94b107480c48e548d6db51c6840b7b33c",
"src": "https://github.com/nvim-tree/nvim-tree.lua"
},
"nvim-web-devicons": { "nvim-web-devicons": {
"rev": "2ae6958df7ced50baac5035cec0c15799eedfbf7", "rev": "2ae6958df7ced50baac5035cec0c15799eedfbf7",
"src": "https://github.com/nvim-tree/nvim-web-devicons" "src": "https://github.com/nvim-tree/nvim-web-devicons"