guard-primary-checkout¶
Blockiert Commits, die direkt im primären Checkout gemacht werden, während dieser auf einem Feature-Branch sitzt. Feature-Arbeit gehört in einen dedizierten git worktree, der vom Integration-Branch abzweigt.
Siehe Referenzen → Gemeinsamer Vertrag für die Konventionen zu Pinning, Fail-open und primärer-Checkout-versus-Worktree, die für jeden Hook gelten.
Voraussetzungen¶
- pre-commit im
PATH. - Ein
git-Repository. Der Hook ruft ausschließlichgitauf; er hat keine weitere Laufzeitabhängigkeit.
Argumente¶
| Argument | Default | Zweck |
|---|---|---|
--branch <name> |
develop |
Der Integration-Branch, auf dem der primäre Checkout bleiben muss. --branch=main für Repositories, die auf main integrieren. |
Argumente werden über die args:-Liste von pre-commit übergeben:
hooks:
- id: guard-primary-checkout
args: [--branch=main]
Verhalten¶
- Greift nur im primären Checkout. Der Hook vergleicht das pro-Worktree-git-dir mit dem geteilten git-common-dir; sie sind nur im primären Checkout gleich. In einem linked Worktree unterscheiden sie sich, also endet der Hook mit Exit 0 — Feature-Branch-Commits gehören dorthin.
- Erlaubt den Integration-Branch. Wenn der primäre Checkout auf dem
konfigurierten Branch ist (Default
develop), läuft der Commit durch. - Blockiert alles andere. Auf jedem anderen Branch — oder einem detached HEAD — im primären Checkout wird der Commit mit Exit 1 verweigert, samt einer Meldung, die zeigt, wie man die Arbeit in einen Worktree verschiebt.
- Fail-open in CI. Wenn
CIgesetzt ist, endet der Hook sofort mit Exit 0. - Verändert nie den Zustand. Er verweigert nur den Commit; Branch, Index und Arbeitsbaum bleiben unangetastet.
Er ist mit always_run: true und pass_filenames: false registriert, feuert
also bei jedem Commit, unabhängig davon, welche Dateien gestaged sind.
Beispiel¶
# .pre-commit-config.yaml im Konsument-Repository
repos:
- repo: https://github.com/nolte/pre-commit-hooks
rev: v1.0.0
hooks:
- id: guard-primary-checkout
Ein Commit, der auf einem Feature-Branch im primären Checkout versucht wird:
✖ Primary checkout is on branch 'feat/x', not 'develop' — commit blocked.
The primary checkout (…) is for integration only and MUST stay
on 'develop' at all times. Feature work happens on a feature
branch in a dedicated worktree that branches off 'develop'.
Fehlerbehebung¶
- Der Hook blockiert einen legitimen Commit auf
main. Das Repository integriert aufmain, nicht aufdevelop. Konfiguriere es mitargs: [--branch=main]. - Der Hook feuert gar nicht. Bestätige, dass
pre-commit installim Clone gelaufen ist und dass der Commit im primären Checkout passiert. In einem linked Worktree ist der Hook absichtlich still. - CI-Commits werden unerwartet blockiert. Werden sie nicht: Der Hook
endet mit Exit 0, sobald
CIgesetzt ist. Braucht ein lokaler Automatisierungskontext denselben Bypass, setzeCI=1für diesen Aufruf. - Ein Commit muss zur Drift-Reparatur im primären Checkout landen. Führe den git-Befehl aus einem Worktree aus oder lege den Hook vorübergehend beiseite; der Hook gibt beim Blockieren die worktree-basierten Reparaturschritte aus.
Verwandt¶
- Das
worktree-Modul vonnolte/taskfiles(task worktree:add) erstellt die dedizierten Worktrees, zu denen dieser Hook hinleitet.