Vorrei eseguire un test unitario prima di ogni push Git e se i test falliscono, annullare il push, ma non riesco nemmeno a trovare il gancio pre-push, c'è pre-commit e pre solo rebase.Git pre-push hook
risposta
Preferirei eseguire il test in un hook pre-commit. Perché la modifica è già stata registrata durante il commit. Spingi e tira solo le informazioni di scambio sulle modifiche già registrate. Se un test fallisce, avresti già una revisione "errata" nel tuo repository. Che tu lo stia spingendo oppure no.
Se si utilizza la riga di comando, il modo più semplice per eseguire questa operazione è scrivere uno script push che esegua i test dell'unità e, in caso di esito positivo, completa la richiesta.
Modifica
Come di git 1.8.2 questa risposta non è aggiornato. Vedere la risposta di Manojlds sopra.
si fa a non significa utilizzare ganci tutti? basta sostituire "git pull" con, ad esempio, "git uinttestspull"? non è esattamente quello di cui ho bisogno: – sheepwalker
@epeepwalker: s/pull/push /, e usa un alias per renderlo bello e breve. – Cascabel
@sheepwalker Sì, non è esattamente quello che hai chiesto, ma come ha detto @calmh, non ci sono ganci pre-push. – kubi
Non c'è un hook per questo, perché un push non è un'operazione che modifica il repository.
È possibile eseguire i controlli sul lato ricevente tramite il gancio post-receive
. È lì che normalmente rifiuterai una spinta in arrivo. Eseguire test unitari potrebbe essere un po 'impegnativo da fare in un hook, ma dipende da voi.
Per la cronologia, c'è un patch to Git 1.6 that adds a pre-push hook. Non so se funzioni contro 1.7.
Anziché confondere, è possibile eseguire script push come raccomandato @kubi. Potresti anche renderlo un compito Rake, quindi è nel tuo repository. ruby-git potrebbe aiutare con questo. Se si controlla il repository di destinazione, è possibile eseguire i test solo quando si spinge al repository di produzione.
Infine, è possibile eseguire i test nel proprio hook pre-commit
ma controllare per quale ramo è stato eseguito il commit. Quindi potresti avere un ramo, ad esempio production
, che richiede il passaggio di tutti i test prima di accettare un commit, ma il tuo master
non interessa. limerick_rake potrebbe essere utile in questo scenario.
grazie, in realtà ho già scelto l'ultima variante (Infine, potresti eseguire i tuoi test nel tuo hook pre-commit ..) – sheepwalker
Git ha ottenuto il rilascio pre-push
nella versione 1.8.2
.
Esempio pre-push
script: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample
1.8.2 note di rilascio parlando del nuovo gancio di pre-push: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt
Ehi amico .. Grazie .. :) –
@manojlds sai cos'è questo gancio disegnato essere usato per? Mi piacerebbe usarlo per spingere il mio binario ai miei clienti quando si spinge verso un ramo specifico (cioè costruire la versione notturna e caricarla con il ricciolo, prima di spingere). Il problema è che ci vuole un po 'di tempo per costruire e caricare, e il remoto chiude la connessione. Così finisco con il mio binario costruito e caricato sui clienti ma non trasferito su un repository, perché il repo remoto chiude la connessione. Qualche idea su come aggirare questo? O forse è una cattiva idea nella sua radice. – igrek
@igrek hai trovato una soluzione al problema di chiusura della connessione? –
Git ha ottenuto il gancio pre-push nella release 1.8.2.
I ganci pre-push sono ciò che mi serviva insieme ai ganci pre-commit. Oltre a proteggere un ramo, possono anche fornire una sicurezza aggiuntiva combinata con i ganci pre-commit.
E per un esempio su come utilizzare (preso e adottato e migliorato da this nice entry)
esempio semplice eseguire il login per Vagrant, eseguire test e quindi spingere
#!/bin/bash
# Run the following command in the root of your project to install this pre-push hook:
# cp git-hooks/pre-push .git/hooks/pre-push; chmod 700 .git/hooks/pre-push
CMD="ssh [email protected] -i ~/.vagrant.d/insecure_private_key 'cd /vagrant/tests; /vagrant/vendor/bin/phpunit'"
protected_branch='master'
# Check if we actually have commits to push
commits=`git log @{u}..`
if [ -z "$commits" ]; then
exit 0
fi
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [[ $current_branch = $protected_branch ]]; then
eval $CMD
RESULT=$?
if [ $RESULT -ne 0 ]; then
echo "failed $CMD"
exit 1
fi
fi
exit 0
Come si può vedere l'esempio utilizza un ramo protetto, soggetto del gancio pre-push.
Il script linked by the highly-voted answer mostra i parametri ecc per il pre-push
hook ($1
è nome remoto, $2
URL) e come accedere i commit (linee read
da stdin hanno struttura <local ref> <local sha1> <remote ref> <remote sha1>
)
#!/bin/sh
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local sha1> <remote ref> <remote sha1>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
remote="$1"
url="$2"
z40=0000000000000000000000000000000000000000
while read local_ref local_sha remote_ref remote_sha
do
if [ "$local_sha" = $z40 ]
then
# Handle delete
:
else
if [ "$remote_sha" = $z40 ]
then
# New branch, examine all commits
range="$local_sha"
else
# Update to existing branch, examine new commits
range="$remote_sha..$local_sha"
fi
# Check for WIP commit
commit=`git rev-list -n 1 --grep '^WIP' "$range"`
if [ -n "$commit" ]
then
echo >&2 "Found WIP commit in $local_ref, not pushing"
exit 1
fi
fi
done
exit 0
- 1. Gestione git hook
- 2. PowerShell Git Codice Hook Exit
- 3. funzionalità di hook pre-fetch in git
- 4. Git pre-commit hook: file modificati/aggiunti
- 5. Link simbolico a un hook in git
- 6. C'è qualche git hook per pull?
- 7. utilizzando git hook dopo il commit
- 8. Creare un hook di commit git BitBucket?
- 9. Come installare git hook su "npm install"?
- 10. Scrivi GIT pre-commit hook in java?
- 11. Come configurare Git post hook di commit
- 12. Informazioni sugli hook di git di base
- 13. Quale utente esegue il hook git?
- 14. git hook post-merge - errore: impossibile eseguire
- 15. Esecuzione di hook Git su Windows
- 16. impostazione di un hook git post-receive
- 17. Chiamare 'git pull' da un hook post-update git
- 18. Git checkout in hook post-ricezione: "Not a git repository". ""
- 19. C'è un hook git che gira su git reset?
- 20. Git pre-commit hook non in esecuzione su Windows
- 21. Git post-commit hook come attività in background
- 22. Git Post-Receive Hook per la gestione dei siti Web
- 23. git non può eseguire python-script come hook
- 24. Git pre-commit hook: ottenere l'elenco dei file modificati
- 25. Come è possibile utilizzare raw_input() in un hook Git Python?
- 26. Pre commit hook per JSLint in Mercurial e Git
- 27. Come scrivere un hook pre-unione in Git?
- 28. errore msysgit con ganci: "errore git: impossibile generare .git/hook/post-commit: nessun file o directory"
- 29. Git: converti ritorno a capo \ r su nuova riga \ n con git hook?
- 30. hook pre-commit bypass per commit commit
Generalmente sono d'accordo, anche se hai l'abitudine di fare un sacco di commit incrementali per schiacciare più tardi, e la suite di test è grande, questo potrebbe essere poco pratico. – Cascabel
Vedo. Quindi suggerirei di eseguire i test prima di fondersi con il ramo principale, ma non esiste neanche un hook di pre-unione. Tuttavia esiste un hook di "aggiornamento" che può essere usato per prevenire l'aggiornamento di un ref nel repository remoto: "Appena prima di aggiornare il ref sul repository remoto, viene richiamato il hook di aggiornamento. Il suo stato di uscita determina il successo o il fallimento del ref . aggiornamento il gancio eseguita una volta per ogni ref essere aggiornato, e prende tre parametri: il nome del ref aggiornato, il nome precedente dell'oggetto memorizzate nella ref, e la nuova objectname essere memorizzati nel rif." – ordnungswidrig
Ho deciso di creare la variante @ordnungswidrig - basta usare il gancio di pre-commit, causa delle revisioni "rotte". Ecco la mia variante (test php + phpUntit):
– sheepwalker