.. SPDX-FileCopyrightText: 2023 cusy GmbH
..
.. SPDX-License-Identifier: BSD-3-Clause
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, :abbr:`z.B. (zum Beispiel)` 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
:abbr:`z.B. (zum Beispiel)` 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:
.. tab:: Windows
Bevor das pre-commit Framework mit :term:`uv` 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:
.. code-block:: console
$ uv add pre-commit
.. tab:: Debian/Ubuntu
.. code-block:: console
$ apt install pre-commit
.. tab:: macOS
.. code-block:: console
$ brew install pre-commit
.. tab:: Andere
.. code-block:: console
$ uv add pre-commit
Überprüfen der Installation :abbr:`z.B. (zum Beispiel)` mit
.. code-block:: console
$ uv run pre-commit -V
pre-commit 4.3.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.
.. code-block:: yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.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
.. code-block:: console
$ 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:
.. code-block:: yaml
:emphasize-lines: 7-8
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
…
- id: check-json
types: [file]
files: \.(json|ipynb)$
.. seealso::
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:
.. code-block:: console
$ 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
---------
:samp:`pre-commit run --all-files`
führt alle pre-commit-Hooks unabhängig von ``git commit`` aus:
.. code-block:: console
$ 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
:samp:`pre-commit run {HOOK}`
führt einzelne pre-commit-Hooks aus, :abbr:`z.B. (zum Beispiel)`
:samp:`pre-commit run trailing-whitespace`
.. note::
Beim ersten Aufruf eines pre-commit-Hooks wird dieser zunächst
heruntergeladen und anschließend installiert. Dies kann einige Zeit
benötigen, :abbr:`z.B. (zum Beispiel)` wenn eine Kopie von ``node`` erstellt
werden muss.
:samp:`pre-commit autoupdate`
aktualisiert die Hooks automatisch:
.. seealso::
* `pre-commit autoupdate [options]
`_.
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 :doc:`hooks`.
.. _pre-commit-uv:
``pre-commit-uv``
-----------------
Alternativ könnt ihr auch `pre-commit-uv
`__ verwenden um mit :term:`uv`
:term:`virtuelle Umgebungen ` zu erstellen und Pakete für
Pre-Commit zu installieren.
``pre-commit-uv`` könnt ihr installieren mit:
.. code-block:: console
uv tool install pre-commit --with pre-commit-uv --force-reinstall
Anschließend könnt ihr ``pre-commit-uv`` anstelle von ``pre-commit`` aufrufen.