Eine kaputte Änderung stoppen, bevor sie geteilt wird
Ein Bistro führt seine Preise in einer Datei. Jemand löscht aus Versehen den Teepreis und pusht. Jetzt hat das ganze Team eine kaputte Liste.
Eine Prüfung, die beim Push läuft, hätte Nein gesagt. Echte Teams nutzen solche Prüfungen den ganzen Tag.
Am Ende dieser Lektion
Notiz
Ich kann Git eine Prüfung ausführen lassen, bevor ein Push durchgeht.
Schlüsselbegriffe
| Begriff | Was er bedeutet |
|---|---|
| Hook | ein Skript, das Git zu einem festen Zeitpunkt ausführt |
| Prüfung | ein Test, der besteht oder scheitert |
| Exit-Status | die Zahl, mit der ein Programm endet, 0 bei Erfolg |
| CI | ein Server, der bei jedem Push Prüfungen ausführt |
| Runner | die Maschine, die die Arbeit einer CI erledigt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Hook ist ein Skript, das Git ausführt
Git sucht im Ordner .git/hooks nach Skripten mit festen Namen. Ein Skript namens pre-push läuft kurz vor einem Push. Endet es mit einem Exit-Status ungleich null, stoppt Git den Push.
Das Skript muss ausführbar sein. Hier sucht die Prüfung den Teepreis in preise.txt.
Einen gemeinsamen Ordner zum Pushen anlegen
git init --bare -b main gemeinsam.gitHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ihn in den Ordner laden klonen
git clone gemeinsam.git ladenHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Datei mit zwei Preisen anlegen
printf 'Kaffee 1.50\nTee 1.20\n' > laden/preise.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Prüfung schreiben
printf '#!/bin/sh\ngrep -q "Tee" preise.txt || { echo "Pruefung fehlgeschlagen: Teepreis fehlt"; exit 1; }\necho "Pruefung bestanden"\n' > laden/.git/hooks/pre-pushHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Prüfung ausführbar machen
chmod +x laden/.git/hooks/pre-pushHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Datei vormerken
git -C laden add preise.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Änderung committen
git -C laden commit -m "Preise anlegen"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Pushen und die Prüfung laufen sehen
git -C laden push -u origin mainHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine fehlgeschlagene Prüfung lehnt den Push ab
Machen Sie jetzt die Datei absichtlich kaputt. Löschen Sie die Teezeile und committen Sie. Die Prüfung scheitert, und Git lehnt den Push ab: Der kaputte Commit bleibt auf Ihrem Rechner.
Dann nehmen Sie den schlechten Commit mit git revert zurück und pushen erneut.
Die Teezeile löschen
sed -i '/Tee/d' laden/preise.txtHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Fehler committen
git -C laden commit -am "Tee versehentlich entfernen"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Versuchen, ihn zu pushen
git -C laden pushHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Fehler zurücknehmen
git -C laden revert --no-edit HEADHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Erneut pushen
git -C laden pushHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele glauben, ein Hook gehöre zum Projekt, also habe ihn das ganze Team. Das stimmt nicht. Ein Hook liegt in .git, und ein Klon kopiert ihn nicht. Jeder kann ihn mit --no-verify überspringen. Ein Team braucht dieselbe Prüfung auf dem Server.
CI führt dieselbe Prüfung auf dem Server aus
CI heißt kontinuierliche Integration: ein Server, der bei jedem Push Prüfungen ausführt. Sie schreiben die Schritte in eine Datei, die im Repository liegt, also hat jeder Klon dieselben Regeln.
In Gitea liegt die Datei in .gitea/workflows. Der Server gibt jede Aufgabe an einen Runner. Das Ergebnis erscheint am Pull Request, und eine prüfende Person sieht einen Fehlschlag sofort.
Beispiel: eine Workflow-Datei
| Zeile der Datei | Was sie sagt |
|---|---|
| `name: check` | der Name, den die Seite zeigt |
| `on: [push]` | bei jedem Push ausführen |
| `runs-on: ubuntu-latest` | die Art der Maschine |
| `- uses: actions/checkout@v4` | zuerst die Projektdateien holen |
| `- run: grep -q Tee preise.txt` | die Prüfung selbst, derselbe Test wie im Hook |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Das Gitea des Labs hat keinen Runner
Diese Datei tut die Arbeit des Hooks. Jeder Schritt läuft der Reihe nach, und ein Schritt, der mit einem Status ungleich null endet, lässt die Aufgabe scheitern.
Das Gitea des Labs nimmt die Datei an und verzeichnet bei jedem Push einen Lauf, aber der Lauf bleibt in der Warteschlange. Es ist kein Runner angeschlossen, also führt ihn niemand aus. Ein echtes Team schließt einen an.