<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotfiles/dot_config/git, branch master</title>
<subtitle>My linux config and rc files</subtitle>
<id>https://git.sommerfeld.dev/dotfiles/atom/dot_config/git?h=master</id>
<link rel='self' href='https://git.sommerfeld.dev/dotfiles/atom/dot_config/git?h=master'/>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/'/>
<updated>2026-06-05T10:06:03Z</updated>
<entry>
<title>Add no-hooks rebase alias</title>
<updated>2026-06-05T10:06:03Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-06-05T10:06:03Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=af3b15af163231eb16feff46bbbba85729d07f31'/>
<id>urn:sha1:af3b15af163231eb16feff46bbbba85729d07f31</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Refactor git resign alias</title>
<updated>2026-06-05T10:06:03Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-06-05T10:06:03Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=44ef6219949675c6ab46b230a7f87fb8f6c9665f'/>
<id>urn:sha1:44ef6219949675c6ab46b230a7f87fb8f6c9665f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Move more host tooling to Nix</title>
<updated>2026-06-05T10:06:02Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-06-05T10:06:02Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=b0e83e2ee3fc328e55119ee7c1f09ad7ed20a635'/>
<id>urn:sha1:b0e83e2ee3fc328e55119ee7c1f09ad7ed20a635</id>
<content type='text'>
</content>
</entry>
<entry>
<title>perf(git): disable delta hyperlinks</title>
<updated>2026-05-22T09:41:21Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-22T09:41:21Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=148ec6044004941bc0be63fadea6f9be903c1671'/>
<id>urn:sha1:148ec6044004941bc0be63fadea6f9be903c1671</id>
<content type='text'>
Delta's hyperlink resolution shells out to git rev-parse for every
blob to build clickable file links, which is fine on bare metal but
death-by-fork on a slow VM — 'git diff' could take many seconds
while 'git diff | cat' returns instantly. Turn hyperlinks off; we
get clickable nothing but visible-everything-fast diffs.
</content>
</entry>
<entry>
<title>refactor(git): use classic .git/hooks/ for per-clone override</title>
<updated>2026-05-19T15:50:52Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-19T15:50:52Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=ae04627b43b4d533088b8a389e5462efed2ae8f6'/>
<id>urn:sha1:ae04627b43b4d533088b8a389e5462efed2ae8f6</id>
<content type='text'>
Switch the dispatcher's per-clone override location from the
bespoke .git/hooks-local/ to the classic .git/hooks/. This is:

- The untracked location git has used since forever, so no new
  convention to learn.
- Where husky, lefthook, pre-commit-the-tool, and most other hook
  managers install by default — they now "just work" again under our
  global core.hooksPath.

git init's *.sample files don't collide because the dispatcher only
matches the exact hook name and the executable bit. The only behavior
change is that a forgotten legacy .git/hooks/pre-commit from before
core.hooksPath was set will start running again — that's arguably
restoring expected git semantics, not a regression.
</content>
</entry>
<entry>
<title>feat(git): per-clone hook override at .git/hooks-local/</title>
<updated>2026-05-19T15:50:52Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-19T15:50:52Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=0fc39faa90f97db24043017a845f1754b4bb8b84'/>
<id>urn:sha1:0fc39faa90f97db24043017a845f1754b4bb8b84</id>
<content type='text'>
Adds an untracked per-clone override layer to the hook dispatcher.
Lookup order is now:

  1. &lt;git-dir&gt;/hooks-local/&lt;name&gt; — untracked, per-clone, ignored by git
  2. &lt;repo-top&gt;/.githooks/&lt;name&gt;  — tracked, shared with teammates

Use case: a shared repo ships a .githooks/pre-commit you want to
locally replace without modifying the tracked file. Drop your hook in
.git/hooks-local/&lt;name&gt; (chmod +x) and the dispatcher will run it
instead — the global commit-msg trailer-strip and pre-push gate still
run on top.

If neither override exists, only the global user-level logic runs.
</content>
</entry>
<entry>
<title>feat(git): user-level hooks auto-dispatch into &lt;repo&gt;/.githooks/</title>
<updated>2026-05-19T15:45:17Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-19T15:45:17Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=67868f51bbab5bc3ef5c8ba15433ba401a297f1a'/>
<id>urn:sha1:67868f51bbab5bc3ef5c8ba15433ba401a297f1a</id>
<content type='text'>
Inverts the hook delegation model. Previously per-repo hooks required
a project to either (a) write the entire hook themselves and lose the
global signed-commit / agent-author gate, or (b) override
core.hooksPath and write passthrough stubs that exec back to
$HOME/.config/git/hooks/*. Both are ergonomically miserable.

Now: the global hooks at ~/.config/git/hooks/ are *always* the entry
point. Each one calls a shared dispatcher (_dispatch.sh) that runs
&lt;repo&gt;/.githooks/&lt;hookname&gt; if it exists, propagating its exit status,
and then continues with whatever the global hook itself wants to do.
Projects just drop an executable file at .githooks/&lt;name&gt; — no
core.hooksPath, no stubs, no boilerplate. Repos that don't have a
.githooks/ dir keep working exactly as before.

GIT_HOOK_DISPATCHED guards against re-entry so legacy repos using the
old stub-and-exec pattern don't loop. pre-push tees stdin so both the
repo hook and the global ref-list loop see the full push payload.

Adds two new always-no-op global hooks (pre-commit, post-commit)
purely so the dispatch happens for those events too — previously only
commit-msg and pre-push existed globally.

Refactors this dotfiles repo to use the new pattern: drops the
self-delegating .githooks/pre-push stub and removes the per-repo
core.hooksPath override from `just init` (now an idempotent unsetter
to clean up the override from past bootstraps). The remote-dev VM's
home-manager profile symlinks all four hooks plus _dispatch.sh.
</content>
</entry>
<entry>
<title>feat(git): commit-msg hook strips AI Co-authored-by trailers</title>
<updated>2026-05-19T15:45:17Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-19T15:45:17Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=1f6dc84f68b4631e77ebc11a452cb0b03eecde57'/>
<id>urn:sha1:1f6dc84f68b4631e77ebc11a452cb0b03eecde57</id>
<content type='text'>
Various agentic tools (Copilot CLI, VS Code chat, etc.) auto-append
`Co-authored-by: Copilot &lt;...&gt;` / Claude / Codex trailers, which then
trip the pre-push hook's agent-coauthor check and force a manual
amend before the push goes through. Scrub at commit time instead.

Uses the same agent-substring list as executable_pre-push (kept in
sync by comment). Triggered as commit-msg (not pre-commit — pre-commit
runs before the message exists). Drops matching trailers in-place,
collapses trailing blanks, and is a no-op otherwise.

Also symlinks the new hook in the remote-dev home-manager config so
it deploys on the Ubuntu VM.

Bypass: `git commit --no-verify`.
</content>
</entry>
<entry>
<title>feat: add another work includeIf</title>
<updated>2026-05-14T09:59:45Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-14T09:59:45Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=41926591c513a42a30992a641e5d2875395c1c86'/>
<id>urn:sha1:41926591c513a42a30992a641e5d2875395c1c86</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(git): add resign alias</title>
<updated>2026-05-14T09:58:37Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-14T09:58:37Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=74b3cb9b574b3e4a88020b1b3eb45fcfa4d448be'/>
<id>urn:sha1:74b3cb9b574b3e4a88020b1b3eb45fcfa4d448be</id>
<content type='text'>
Rebases onto @{u} re-signing each commit with the current author
identity and key, while stripping any Co-authored-by lines. Hooks are
disabled (core.hooksPath=/dev/null) so chezmoi's post-commit hook
doesn't fire once per replayed commit.
</content>
</entry>
</feed>
