Ich habe ein zentrales Git-Repository. Wenn ein Push zu diesem Repo gemacht wird, möchte ich einen Post-Receive-Hook ausführen. Dieser Hook erstellt eine Nachricht in einem Basecamp-Projekt (unter Verwendung ihrer API). Ich möchte Informationen zu dem gerade durchgeführten Update erhalten. Momentan denke ich, git log -2 --stat
ist gut genug, würde aber gerne ein wenig mehr Informationen haben (Zweig, der aktualisiert wurde, Datei erstellt, Dateien entfernt). Kann jemand mit den Befehlen helfen, die ich benötige, um alle Informationen zu erhalten? Die Ausführung mehrerer Befehle ist bei mir in Ordnung, wahrscheinlich gibt es keinen einzigen Befehl, der mir alle Informationen liefert.
Sie können das neueste Commit finden, indem Sie die Dateien unter .git/refs/heads
untersuchen und sortieren: Jedes Mal, wenn ein neues Commit durchgeführt wird, wird die entsprechende refs/heads
-Datei geändert, dh wenn master
übernommen wird, wird refs/heads/master
aktualisiert .
Lasst uns also eine Lösung entwickeln.
Erste Aufgabe: finde alle Zweige (dh alle Dateien unter refs/heads
und drucke sie aus, wenn sie zuletzt geändert wurden. Du sprichst von Hooks, also geben wir den Pfad relativ zum% co_de an % Verzeichnis:
Dies erzeugt eine Liste aller Zweige mit ihrem Änderungsdatum. Eine Erläuterung der Parameter finden Sie auf der man-Seite von .git/hooks
.
Zweite Aufgabe: Sortiere die erhaltene Liste
%Vor% Dritte Aufgabe: Wir brauchen das neueste Element in dieser Liste. Da find
von alt nach neu sortiert, befindet sich unser gewünschter Eintrag am Ende der Liste. Holen Sie sich dieses Element mit sort
(nur ein Element, deshalb übergeben Sie das tail
-Flag):
Vierte Aufgabe: Löschen Sie das Datum in der erhaltenen Zeile. Aus unserer -1
-Anweisung wissen wir, dass Datum und Pfad durch ein Leerzeichen getrennt sind. Führen Sie dies als Trennzeichen in printf
( cut
) ein und teilen Sie uns mit, dass wir das zweite Feld (d. H. Den Dateipfad -d " "
) benötigen. Der Einfachheit halber speichern wir diesen Dateipfad in einer Variablen namens -f 2
:
Fünfte Aufgabe: Jetzt kennen wir den Dateinamen, aber wir brauchen den Inhalt. Dies ist die letzte Änderung, die an $LATESTHEAD
übergeben werden konnte. git log
erledigt den Job. Speichere die letzte Version in cat
Nun könnten Sie $LATESTREV
verwenden, um irgendwelche schmutzigen Dinge zu machen, die Sie wollen.
Vielleicht nicht die eleganteste Lösung (wahrscheinlich wird jemand kommen und Ihnen einen viel einfacheren One-Liner erzählen), aber funktioniert für mich.
Wenn Sie --summary
zu Ihrem Git-Protokoll hinzufügen, wird die Liste der neuen und gelöschten Dateien erstellt (git verweist auf sie als "Knoten"):
Um die Verzweigung zu erhalten, versuchen Sie Folgendes auszuführen:
%Vor% Hinweis: Ich teste das auf meinem Mac. Unix cut
ist 1 indiziert, aber ich glaube Debian cut
ist 0 indiziert. Wenn ja, und wenn Sie sich in einer Debian-Box befinden, ändern Sie -f1
in -f0
und der Verzweigungsbefehl sollte einfach funktionieren
Wenn es keinen bestimmten Grund gibt, warum Sie post-receive
verwenden, würde ich eher vorschlagen, update
zu verwenden, wodurch der alte Verweis, der neue Verweis und der Zweig als Befehlszeilenargumente abgerufen werden.
Sie können also das gesamte Protokoll mit den hier vorgeschlagenen git log
-Befehlen abrufen und oldref..newref
als Argument angeben (wobei oldref
bzw. newref
ersetzt werden).
Weitere Informationen finden Sie auf der Hilfeseite githooks (5) auf dem Update-Hook . Sie können das Update sogar an dieser Stelle abbrechen, wenn Sie es benötigen.
Tatsächlich erhalten Sie die gleichen Informationen im post-receive
Hook auf stdin. Ich verstehe nicht, warum Sie eine Menge von find
-Befehlen ausführen müssen, um diese Aufgabe zu erledigen.