2011-10-09 25 views
5

Ho appena iniziato a scrivere un'applicazione web.utilizzando git hook dopo il commit

Sto usando GIT per il controllo della versione e ho git e web server nello stesso computer.

applicazione dispone di 3 ambienti: dev, collaudo e produzione

voglio usare il gancio git dopo ogni commit per aggiornare dev, test o applicazioni di produzione.

qual è la migliore pratica per questo?

ho bisogno di qualcosa di simile:

  1. quando ho commesso, Dev deve essere aggiornato automaticamente
  2. quando messaggio di commit contiene "test:" di fronte a un messaggio - dev e prova deve essere aggiornato.
  3. quando il messaggio di commit contiene "produzione:" davanti al messaggio: produzione, dev e test devono essere aggiornati.

Grazie!

+4

Solo un suggerimento (perché sembra più coerente e più semplice): utilizzare uno _branch_ per dev, uno per il test e uno per la produzione. Ogni volta che si preme per "testare" un hook dovrebbe aggiornare il test env (e così via). – KingCrunch

+0

grazie per aver condiviso il tuo suggerimento – Irakli

risposta

1

Ho appena scritto un/mini script bash gancio per risolvere questo problema

#!/bin/bash 

if git log --pretty=format:%s -1 | grep -q "^test: " 
then 
    #action/update dev/test 
elif git log --pretty=format:%s -1 | grep -q "^production: " 
then 
    #action/update dev/test/production 
else 
    #action/update dev 
fi 

E 'il mio primo script bash così .. si prega di contribuire a migliorare questo :)

+0

Utilizzare 'git checkout -f' qui potrebbe essere utile. – jackyalcine

1

È possibile scrivere un post-commit hook che analizzare il messaggio di commit utilizzando qualcosa come git log -1 --format=%B e fare l'azione appropriata come git push dev ecc

Se si sta parlando di spingere i tuoi commit ad un repo centrale a distanza e tale repository deve fare questo, quindi è necessario utilizzare un hook post-receive in modo simile. Nota che gli hook di commit vengono eseguiti sul repository del client in cui viene eseguito il commit.

Detto questo, spingere verso gli ambienti usando quello che dici nel messaggio non è un flusso di lavoro adeguato. Puoi avere diversi rami, in cui puoi selezionare i tuoi commit ecc. Puoi impostare hook in modo che quando si preme il ramo test, l'ambiente di test sia aggiornato e così via.

+0

Grazie! Mi hai aiutato – Irakli

+0

Mi hai aiutato ma non è una risposta completa. Si prega di controllare il mio nuovo post su questo problema. Grazie ancora! – Irakli

2

Sulla base di Irakli idea , ecco quello che ho a lavorare come un post-ricevo nel mio repo ...

#!/bin/bash 

MESSAGE=$(git log -1 HEAD --pretty=format:%s) 

if [[ "$MESSAGE" == *\[staging\]* ]]; 
then 
    #action/update staging 
    # another method not being used... 
    # GIT_WORK_TREE=/path/to/working/site/ git checkout -q -f staging 
    echo "NOTE: Beginning Auto-Push to Staging Server... " 
    `git push staging` 
    echo "======================================================== 
======== Done! Pushed to STAGING.com ============= 
======== Thanks Captain. Keep up the good work! ======== 
========================================================" 
elif [[ "$MESSAGE" == *\[production\]* ]]; 
then 
    #action/update production 
    echo "NOTE: Beginning Auto-Push to Production Server... " 
    # `git push production` 
    echo "======================================================== 
======== Done!!! Pushed to Production.com ======= 
======== Test immediately for any errors! ========= 
========================================================" 
fi 

Nota:

per far funzionare 'git push staging', devi avere un hook .git/hooks/post-reveive su quell'albero di lavoro. Ho usato this code tranne che ho aggiunto 'umask 002 & & reset git --hard' in basso.

Ho anche dovuto aggiungere un denyrecive al file di .git/config che di albero di lavoro:

[receive] 
    denycurrentbranch = ignore 

Nota 2:

Si prega di notare questa configurazione non è per tutti ... solo per piccole (ish) i siti in cui gli aggiornamenti sporchi rapidi sono corretti da &.

Problemi correlati