Erhalte das letzte Commit des Git-Repositorys

8

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.

    
Jeebs24 22.06.2012, 02:41
quelle

3 Antworten

3

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:

%Vor%

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):

%Vor%

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 :

%Vor%

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

%Vor%

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.

    
eckes 22.06.2012, 05:45
quelle
2

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"):

%Vor%

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

    
Ben Roux 22.06.2012 06:05
quelle
1

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.

    
Jonas Wielicki 22.06.2012 13:19
quelle

Tags und Links