2013-07-06 6 views
11

In unserem Projekt (das auf GitHub gehostet wird) zwingt jemand aus Versehen den Master gelegentlich zwingt. Niemand ist sich dessen bewusst, und ich würde gerne herausfinden, wer es tut und welche Art von fehlerhaft konfiguriertem Werkzeug oder schlechter Gewohnheit dahinter steckt.Find Committer eines Force Push auf Github

Die Frage ist also, wie man den Benutzer identifiziert, der den Force Push gemacht hat? Als ich ziehe ich etwas sehen:

# git pull --prune 
(.....) 
+ 4c0d44c...138b9ed master  -> origin/master (forced update) 

aber 138b9ed ist nur das jüngste in origin/master begehen, und jeder könnte, nachdem die Kraft Push begangen haben; es ist sogar möglich, dass der Kraftschieber selbst nichts getan hat, nur umgestaltet, so dass sein Name nicht einmal im umgeschriebenen Teil der Herkunft/Meistergeschichte als Autor vorhanden ist.

Ich habe auch versucht git reflog origin/master, aber es gibt nur die gleichen Informationen: Es gibt einen Datensatz mit der ID begehen sagen git pull --prune (forced update) ist 138b9ed, aber das wird wieder das letzte Committer in Master geben, nicht derjenige, der die Kraft Push tat. Das Ausführen von git reflog master auf dem Ursprungsserver würde wahrscheinlich helfen, aber GitHub gibt Ihnen nicht diese Art von Zugriff AFAIK.

Gibt es eine zuverlässige Möglichkeit herauszufinden, von wem der Push stammt (und wann)?

Antwort

11

Sie können ein webhook zu Ihrem Github-Repository hinzufügen und die Push-Benachrichtigungen an einen Server oder einen Dienst wie requestb.in senden lassen.

Die Benachrichtigungsnutzlast verfügt über einen Schlüssel pusher, der das Github-Benutzerkonto identifiziert, das zum Übertragen der Aktualisierungen verwendet wird. Auf diese Weise sollten Sie in der Lage sein, den "bösen Buben" zu identifizieren.

Edit: Die Nutzlast hat auch einen booleschen forced Schlüssel, der Ihnen sagt, ob die gerade --force gedrückt wurde oder nicht. Es ist nicht gezeigt in Githubs Beispiel Payload [as of 2013-07-06], aber sichtbar in this other example.

Bearbeiten: Dies ist nur möglich, weil Github eine integrierte Lösung ist, die den Pusher identifiziert und diese Informationen in der Webhook-Nutzlast bereitstellt. Bei Verwendung eines reinen Git-Servers (z. B. nur mit SSH zur Autorisierung) oder einer anderen Git-Serving-Lösung (Gitolite, Gitlab usw.) ist dies möglicherweise nicht möglich. Git selbst hat keine Möglichkeit, den Benutzer zu identifizieren, der schiebt (Git speichert nur Benutzerinformationen in Commit- und Tag-Objekten), daher muss diese Information durch die Identifikation & Autorisierungsteil der Verbindung bereitgestellt werden (dies kann SSH oder HTTPS oder dergleichen sein) Es kann auch komplett fehlen, zB wenn lokal auf ein Repo im selben Dateisystem gedrängt wird).

+0

Also im Grunde würde ich prüfen, ob "vor" ist ein Vorfahre von 'nachher 'in der [post-receive webhook] (https://help.github.com/articles/post-receive-hooks) Payload, und wenn nicht, es war ein Kraftstoß? – Tgr

+0

Ja (+1), ... entweder diese Antwort, oder verwenden Sie einen Polygraphen;) wie in http://stackoverflow.com/a/15030429/6309. – VonC

+0

@Tgr, die Nutzlast hat eine "erzwungene" Taste, die Ihnen sagt, ob der Push erzwungen wurde;) –