Git Commit-Messages mit ChatGPT

Commit-Messages in Git werden oft vernachlässigt. Viele sehen sie lediglich als notwendiges Übel an, um Änderungen zu speichern. Dabei sind aussagekräftige Commit-Messages ein entscheidender Faktor für den Erfolg eines Projekts: Sie sorgen eine gute Nachvollziehbarkeit von Änderungen, eine effiziente Zusammenarbeit im Team und eine schnellere Fehlersuche. Kein Grund, die Commit-Messages automatisch mit Hilfe von KI vorbereiten zu lassen.


Mit Hilfe von sog. Hooks ist es möglich, Scripte z.B. zum automatisierten Testing oder zur Codeprüfung zu bestimmten Ereignissen während des Git-Workflows auszuführen. Der clientseitige prepare-commit-msg-Hook wird unmittelbar vor dem Öffnen des Commit-Editors ausgeführt. Das folgende Bash-Script muss dazu beispielsweise im Ordner ~/git-template/hooks/prepare-commit-msg abgelegt werden:

0d311d3e3743f65bd1f7fa370c3b3848

Schließlich fügt man seinen OpenAI-API-Key in Zeile 4 ein und modifiziert auf Wunsch noch das verwendete ChatGPT-Model in Zeile 5 (in unserem Beispiel gpt-4o). Anschließend machen wir das Script ausführbar mit chmod +x ~/git-template/hooks/prepare-commit-msg und setzen mit git config --global core.hooksPath ~/git-template/hooks das Standardverzeichnis für Git-Hooks in der globalen Git-Konfiguration.

Das Script generiert für den diff aller gestagten Dateien automatisch eine passende Vorlage für die Commit-Message: git add -A . && git commit. Alternativ kann man auch eine leere Nachricht (".") senden, die anschließend automatisch überschrieben wird: git add -A . && git commit -m "." && git push – doch Vorsicht: Hier ist keine Validierung der Nachricht mehr möglich.

Die KI-Modelle sind inzwischen so weit, dass sehr vernünftige automatische Commit-Messages auf Basis der Änderungen erstellt werden. Durch Anpassung des Prompts (Ab Zeile 13) kann man die Rückgabe weiter optimieren. Das Script funktioniert übrigens auch in Git-UI-Tools wie Tower und SmartGit. Will man das Verhalten wieder deaktivieren, genügt ein git config --global --unset core.hooksPath.

Zurück