2013-07-06 5 views
11

Nel nostro progetto (che è ospitato su GitHub), qualcuno forza accidentalmente spinge il master ogni tanto. Nessuno è consapevole se farlo, e mi piacerebbe scoprire chi lo fa e che tipo di strumento errato o cattiva abitudine è dietro di esso.Trova committer di una forza push su github

Quindi la domanda è, come identificare l'utente che ha fatto il push forzato? Quando tiro vedo qualcosa di simile:

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

ma 138b9ed è solo l'ultimo di commit di origine/master, e chiunque avrebbe potuto compiuti dopo che la forza di spinta; è anche possibile che lo spintore non abbia commesso nulla, semplicemente ribattezzato, quindi il suo nome non è nemmeno presente nella parte di origine riscritta/la storia del maestro come autore.

Ho anche provato git reflog origin/master, ma semplicemente dà le stesse informazioni: v'è un verbale dicendo git pull --prune (forced update) con l'id commettere 138b9ed, ma che ancora una volta dare l'ultima committer in padrone, non quello che ha fatto la spinta forza. L'esecuzione di git reflog master sul server di origine probabilmente sarebbe di aiuto, ma GitHub non ti dà quel tipo di accesso AFAIK.

Esiste un modo affidabile per scoprire da chi proviene la spinta (e quando)?

risposta

11

È possibile aggiungere uno webhook al repository Github e inviarlo le notifiche push a un server o un servizio come requestb.in.

Il carico utile di notifica ha una chiave pusher che identifica l'account utente Github utilizzato per inviare gli aggiornamenti. In questo modo dovresti essere in grado di identificare il "cattivo".

Modifica: il payload ha anche una chiave booleana forced, che indica se il pari è stato --force inviato o meno. È non mostrato nel carico utile di esempio di Github [a partire dal 2013-07-06], ma visibile in this other example.

Modifica: questo è possibile solo perché Github è una soluzione integrata che identifica lo spintore e fornisce tali informazioni nel payload del webhook. Utilizzando un server Git puro (ad esempio utilizzando solo SSH per l'autorizzazione) o una diversa soluzione di servizio Git (Gitolite, Gitlab, ecc.), Ciò potrebbe non essere possibile. Git non ha modo di identificare l'utente che lo spinge (Git salva solo le informazioni dell'utente negli oggetti commit e tag), quindi queste informazioni devono essere fornite dall'identificazione & parte di autorizzazione della connessione (questo può essere SSH o HTTPS o simili ; può anche mancare del tutto, per esempio quando si spinge localmente su un repository sullo stesso file system).

+0

Quindi in pratica verificherei se 'before' è un antenato di' after' nel payload [post-ricevi webhook] (https://help.github.com/articles/post-receive-hooks), e se no, era una spinta forzata? – Tgr

+0

Sì (+1), ... o quella risposta, o utilizzare un poligrafo;) come in http://stackoverflow.com/a/15030429/6309. – VonC

+0

@Tgr, il payload ha una chiave 'forced' che ti dice se il push è stato forzato;) –