Tutorial

Commits automatisch mit Karten verknüpfen

Einen post-commit-Hook einrichten, der jeden Commit an die passende Karte hängt — und warum die Stelle im Commit entscheidet, ob sie sich bewegt.

Zuletzt aktualisiert:

Wer einen Kartenschlüssel in den Commit schreibt, hat die Arbeit eigentlich schon dokumentiert — sie steht nur an der falschen Stelle. Diese Anleitung richtet einen post-commit-Hook ein, der jeden Commit automatisch an die passende Karte hängt: mit Autor, SHA, Branch und Nachricht. Die Git-Integration ist im Developer-Plan enthalten.

Was du brauchst

  • Den Developer-Plan — dort liegen Git-Integration und API-Zugriff. Siehe Preise.
  • git und curl auf dem Rechner.
  • Ein Repository — egal ob GitHub, GitLab, Gitea oder selbst gehostet.

1. Plan und Werkzeuge prüfen

Der Hook spricht mit der Zuuna-API. Beides — Git-Integration und API-Zugriff — gehört zum Developer-Plan; in niedrigeren Plänen antwortet die Schnittstelle nicht.

2. API-Token erstellen

Öffne die Developer-Konsole in Zuuna und erstelle ein Token. Gib ihm nur den Scope, den der Hook wirklich braucht: git:write. Der Token beginnt mit zk_live_ und wird dir genau einmal angezeigt — danach ist nur noch sein Präfix sichtbar.

3. CLI installieren

Im Wurzelverzeichnis deines Repositories:

curl -o zuuna https://app.zuuna.de/zuuna.sh && chmod +x zuuna

4. Repository verbinden

./zuuna init https://app.zuuna.de zk_live_dein_token [gruppen-id]

Das schreibt .git/zuuna.conf und installiert einen post-commit-Hook. Ab jetzt schickt jeder Commit zwei Ereignisse an Zuuna: den Commit selbst und den Branch, auf dem er entstanden ist. Beides landet in .git/ und damit nicht im Repository — dein Token wird nicht mitversioniert.

5. Ersten Commit mit Kartenschlüssel schreiben

Und hier kommt der Teil, den kaum ein Werkzeug erklärt: wo der Kartenschlüssel steht, entscheidet, was passiert.

Wo der Schlüssel stehtBedeutungWirkung
Betreffzeile oder Branch-NameArbeitverknüpft und löst Automatisierungen aus
Body, nach fix, fixes, closes, resolves, implementsArbeitverknüpft und löst aus
Body, nach ref, see, part of, related to, viaReferenzverknüpft nur — keine Automatisierung
Body als Fließtext, ohne Schlüsselwortgar nichts

Diese Unterscheidung gibt es aus einem konkreten Grund: Ein Commit mit „notiert als ZNA-248 für später“ im Body hat einmal vier unangetastete Backlog-Karten auf „Git committed“ gezogen. Das Board behauptete Arbeit, die nie stattgefunden hatte. Nennt man dieselbe Karte an beiden Stellen, gewinnt Arbeit vor Referenz.

Ein sauberer Commit sieht also so aus:

ZNA-164: Sprint-Auswahl im Backlog ergänzt

Setzt die Auswahl auf den aktiven Sprint vor.
ref ZNA-165

ZNA-164 zählt als Arbeit und bewegt die Karte, ZNA-165 wird nur verlinkt.

6. Ergebnis auf der Karte prüfen

Öffne die Karte. Im Development-Bereich stehen jetzt Commit, Autor, SHA und Branch. Damit ist die Frage „was gehört eigentlich zu diesem Ticket?“ nicht mehr eine Suche im Git-Log, sondern eine Zeile auf der Karte.

Wenn es nicht klappt

  • Nichts passiert. Prüf zuerst, ob der Hook läuft: .git/hooks/post-commit muss existieren und ausführbar sein. Ein Klon des Repositories bringt ihn nicht mit.
  • Der Commit ist verknüpft, aber die Karte bewegt sich nicht. Dann stand der Schlüssel im Body ohne Schlüsselwort oder hinter einem Referenz-Schlüsselwort. Siehe die Tabelle oben — das ist Absicht, kein Fehler.
  • Falsches Präfix. Der Schlüssel muss dem Kartenpräfix der Gruppe entsprechen und wird groß geschrieben ausgewertet.
  • 401 oder 403 im Hook-Log. Token abgelaufen, widerrufen, oder ohne git:write. Neu erstellen und zuuna init erneut ausführen.

Nächste Schritte

Häufige Fragen

Funktioniert das mit GitLab, Gitea oder selbst gehostetem Git?

Ja. Der Hook ist ein einfacher HTTPS-Aufruf aus deinem lokalen Repository heraus — er interessiert sich nicht dafür, wo das Repository gehostet wird. Für Pull Requests gilt das nicht: PR-Tracking läuft heute nur über GitHub.

Muss ich in jedem Repository etwas installieren?

Ja. Der Hook lebt in .git/hooks des jeweiligen Repositories und wandert nicht mit einem Klon mit. Pro Repository einmal zuuna init — das war es.

Kann ich mehrere Karten in einem Commit nennen?

Ja. Nenne sie einzeln (ZNA-164 ZNA-165) oder in der Kurzschreibweise mit Schrägstrichen: ZNA-164/165/166 wiederholt das Präfix automatisch.

Was passiert bei einem Rebase oder Force-Push?

Der Hook läuft beim Commit, nicht beim Push. Umgeschriebene Commits bekommen neue SHAs; die alten Verknüpfungen bleiben auf der Karte stehen. Das ist gewollt — die Karte zeigt, was tatsächlich passiert ist, nicht die aufgeräumte Fassung.

Welcher Plan ist nötig?

Der Developer-Plan. Er enthält die Git-Integration und den API-Zugriff, den der Hook nutzt.

Bau diesen Schritt in deinem Workspace nach.

Die Anleitung dauert ein paar Minuten — mit deinem eigenen Board dahinter bleibt sie hängen. 14 Tage voller Zugriff, ohne Kreditkarte.