pre-commit-Framework

pre-commit ist ein Framework zum Verwalten und Pflegen mehrsprachiger Commit-Hooks.

Eine wesentliche Aufgabe ist es, dem gesamten Entwicklungsteam dieselben Skripte zur Verfügung zu stellen. pre-commit von yelp verwaltet solche Hooks und verteilt sie auf verschiedene Projekte und Entwickler.

Git Hooks werden meist verwendet um vor Code Reviews automatisch auf Probleme im Code hinzuweisen, z.B. um die Formatierung zu überprüfen oder Debug-Anweisungen zu finden. pre-commit vereinfacht das projektübergreifende Teilen vom Hooks. Dabei ist auch die Sprache, in der z.B. ein Linter geschrieben wurde, wegabstrahiert – so ist scss-lint in Ruby geschrieben, ihr könnt ihn jedoch mit pre-commit verwenden ohne eurem Projekt ein Gemfile hinzufügen zu müssen.

Installation

Bevor ihr die Hooks ausführen könnt, muss das pre-commit Framework installiert werden:

Bevor das pre-commit Framework mit Pipenv installiert werden kann, müssen zunächst noch die Microsoft Build Tools für C++ heruntergeladen und ausgeführt werden damit anschließend die Desktopentwicklung mit C++ ausgewählt und mit den Standardoptionen installiert werden kann.

Erst dann kann das pre-commit Framework installiert werden mit:

$ uv add pre-commit
$ apt install pre-commit
$ brew install pre-commit
$ uv add pre-commit

Überprüfen der Installation z.B. mit

$ uv run pre-commit -V
pre-commit 2.21.0

Konfiguration

Nachdem Pre-Commit installiert ist, können mit der .pre-commit-config.yaml-Datei im Root-Verzeichnis eures Projekts Plugins für dieses Projekt konfiguriert werden.

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files

Ihr könnt euch eine solche initiale .pre-commit-config.yaml-Datei auch generieren lassen mit

$ uv run pre-commit sample-config > .pre-commit-config.yaml

Wenn ihr check-json auf eure Jupyter Notebooks anwenden möchtet, müsst ihr zunächst konfigurieren, dass die Überprüfung auch für den Datei-Suffix .ipynb verwendet werden soll:

 repos:
   - repo: https://github.com/pre-commit/pre-commit-hooks
     rev: v3.2.0
     hooks:
     
     - id: check-json
       types: [file]
       files: \.(json|ipynb)$

Siehe auch

Eine vollständige Liste der Konfigurationsoptionen erhaltet ihr in Adding pre-commit plugins to your project.

Ihr könnt auch eigene Hooks schreiben, siehe Creating new hooks.

Installieren der Git-Hook-Skripte

Damit Pre-Commit auch vor jedem Commit zuverlässig ausgeführt wird, wird das Skript in unserem Projekt installiert:

$ pre-commit install
pre-commit installed at .git/hooks/pre-commit

Wollt ihr die Git-Hook-Skripte wieder deinstallieren, könnt ihr dies mit pre-commit uninstall.

Ausführen

pre-commit run --all-files

führt alle pre-commit-Hooks unabhängig von git commit aus:

$ uv run pre-commit run --all-files
Trim Trailing Whitespace.................................................Passed
Fix End of Files.........................................................Passed
Check Yaml...............................................................Passed
Check for added large files..............................................Passed
pre-commit run HOOK

führt einzelne pre-commit-Hooks aus, z.B. pre-commit run trailing-whitespace

Bemerkung

Beim ersten Aufruf eines pre-commit-Hooks wird dieser zunächst heruntergeladen und anschließend installiert. Dies kann einige Zeit benötigen, z.B. wenn eine Kopie von node erstellt werden muss.

pre-commit autoupdate

aktualisiert die Hooks automatisch:

Die vom pre-commit-Framework verwalteten Hooks jedoch nicht darauf beschränkt, vor Commits ausgeführt zu werden; sie können auch für andere Git-Hooks verwendet werden, siehe Weitere pre-commit-Hooks.

pre-commit-uv

Alternativ könnt ihr auch pre-commit-uv verwenden um mit uv virtuelle Umgebungen zu erstellen und Pakete für Pre-Commit zu installieren.

pre-commit-uv könnt ihr installieren mit:

uv tool install pre-commit --with pre-commit-uv --force-reinstall

Anschließend könnt ihr pre-commit-uv anstelle von pre-commit aufrufen.