Ich schreibe einen Pre-Receive-Hook, um eine Bestätigung zu geben, bevor ich Commits auf dem Push akzeptiere. Es funktioniert gut mit vorhandenen Zweigen, da ich den folgenden Git-Befehl verwende, um eine Liste von zu erhalten eingehende Commits:
%Vor% Der obige Befehl schlägt jedoch fehl, wenn der Benutzer eine neue Verzweigung in ein gemeinsames Repository verschiebt
old_sha1 ist alles Nullen. Die Frage ist also, wie bekomme ich eine Liste von eingehenden Commits für eine
neu erstellter Zweig Doing git rev-list $new_sha1
funktioniert nicht, da es alle Revisionen bis zum Anfang der Zeiten gibt. Gibt es eine Möglichkeit, so etwas zu spezifizieren:
Versuchen Sie Folgendes:
%Vor% Dies verwendet git for-each-ref
, um bekannte Referenzen zu drucken; gibt in --format
an, dass der Kurzname zusammen mit einem vorhergehenden Caret ausgegeben wird; und sagt mit refs/heads/
nur lokale Köpfe auszuwählen. Am Ende läuft so etwas:
Das Caret bedeutet "von hier aus erreichbare Commits ausschließen". Dies gibt Ihnen also alle Commits, die von $new_sha1
aus erreichbar sind, aber sind nicht von den bestehenden Referenzen.
Um die Fälle new-ref und existed-ref gleichzeitig zu behandeln, können Sie die Array-Unterstützung von bash verwenden:
%Vor%In meinem Fall hat Folgendes geholfen. Ich persönlich finde es sehr einfach.
%Vor%Einfacher können Sie dies verwenden:
%Vor% Es ist ziemlich das gleiche Prinzip wie in Aristoteles Pagaltzis 'Antwort , aber es verwendet nur rev-list
' s in Optionen (von denen ich vermute, dass sie hinzugefügt wurden, nachdem diese Frage beantwortet wurde ...).
Der Parameter --all
entspricht dem for-each-ref
-Teil: Er fügt alle bekannten Refs den Befehlsargumenten hinzu. Der Parameter --not
, in diesem speziellen Fall ist wie das Hinzufügen des Präfix ^
zu allen Referenzen, die von --all
hinzugefügt wurden.
Somit wird dieser Befehl Commits drucken, die von dem neuen SHA1 erreichbar sind, mit Ausnahme aller, die von den bekannten (d. H. Bereits gepushten) Refs erreichbar sind.