2010-04-03 17 views
7

Quando si attiva pre-ricevere gancio per repository git:Git pre-ricezione gancio

Si prende argomenti, ma per ogni ref essere aggiornate ricevuti sullo standard input una linea del formato:

< vecchio-value> SP < nuovo-value> SP < ref-name> LF

dove < vecchio valore> è il vecchio nome dell'oggetto memorizzato nella ref, < nuovo valore> è il nuovo nome dell'oggetto per essere memorizzato nel ref ed è il nome completo e del rif. Quando si crea una nuova ref, < vecchio valore> è 40 0.

Qualcuno mi può spiegare come faccio a esaminare tutti i file che verranno modificati nel repository se mi permetto questo commesso?

Mi piacerebbe eseguire quei file attraverso alcuni script per verificare la sintassi e così via.

Grazie.

risposta

18

Stranamente, avevo un po 'di codice in giro da un git -> Utilità Wordpress che potrebbe aiutare. Quanto segue ti fornirà un elenco di tutti i file modificati nella ricezione, nonché il loro contenuto. Nessuna garanzia, può avere bug, potrebbe non essere il modo più efficiente per farlo, bla bla bla. Alcuni di questo codice si basano su roba in gitshelve, che è davvero una grande cosa da guardare per generico git maniuplation.

+0

Grazie per questo codice, questo ha aiutato molto! Ho apportato un piccolo tweak a 'get_changed_files', quindi usa' --name-only' che semplifica l'analisi dei risultati: https://gist.github.com/1055516 – keegan3d

1

Se volete sapere il fatto che i permessi dei file vengono modificati nel repository locale prima di spingere al repository remoto, eseguire git ls-tree -r commit, dove commettere è l'SHA commettere valore della repository locale.

Questo comando fornisce un elenco di file con le loro autorizzazioni, che possono essere analizzati per verificare se il permesso di un file viene modificato prima di premere.

9

Ho appena fatto questo. Ecco il flusso di base che ho usato.

Nel vostro pre-ricezione gancio, leggere ogni riga da stdin, che (come lei ha ricordato) simile a questa:

oldref newref refname 
  1. Per ogni (oldref, newref) coppia è necessario elencare tutti i commit:

    git show --format=format:%H --quiet oldref..newref 
    
  2. per ogni impegnano è necessario elencare tutti i file:

    git diff --name-only commit^..commit 
    
  3. per esaminare un file, utilizzare git spettacolo:

    git show commit:filepath 
    

    fare tutto ciò verifica del contenuto dei file qui.Se si desidera informare l'utente di un problema, scrivere su stderr

  4. dopo iterazione tutti gli arbitri, si impegna e file diverso da zero a respingere la spinta, o pari a zero per permettere che

Si noti che questo approccio commuta tutti i commit in ordine, quindi se un file viene modificato in più commit verrà esaminata ogni versione. Se si desidera visualizzare solo un file in una volta sola, passare invece il commit in ordine inverso e non esaminare due volte un determinato file. Raccomando comunque il primo approccio in modo da esaminare tutte le versioni dei file trasferiti.

+0

In qualche modo non sono riuscito a sbarazzarmi del diff in 'git show --format = format:% H --quiet oldref..newref'. Forse perché ho aggiunto nuovi file nel repository e il diff era contro/dev/null: D. Penso che 'git log --format =% H oldref newref' dovrebbe fare lo stesso e non ci sono diff :) –

Problemi correlati