2013-07-09 14 views
8

Ho creato uno script di pre-commit per git, che funziona bene quando viene eseguito tramite la riga di comando. Ecco lo script:Uso di git pre-commit hooks nel contesto del client GitHub

#!/bin/sh 
# 
# Pre-commit hooks 
echo "Running unit tests..." 

# Lint stuff before commiting 
grunt runtests 
RESULT=$? 

[ $RESULT -ne 0 ] && echo "Tests (or tasks) failed, aborting the commit" && exit 1 

echo "All tests passed, commiting your changes" && exit 0 

mi piacerebbe piacerebbe pre-impegno a lavorare anche tramite l'applicazione client GitHub, ma non riesco a ottenere che il lavoro. Lo script pre-commit viene eseguito, ma genera un errore. Ecco il testo completo che viene restituito nella finestra di avviso del client:

Running unit tests... 
.git/hooks/pre-commit: line 7: grunt: command not found 
Tests (or tasks) failed, aborting the commit 
(1) 

Per qualche motivo, non è possibile trovare grugnito. Ho reinstallato nuovamente il grunt cli e ho usato il flag globale "-g", ma ciò non ha fatto alcuna differenza. Qualche idea su come posso convincere il cliente a trovare grugniti?

risposta

20

applicazioni GUI su OS X non carica la roba in .bashrc/.bash_profile, il che significa che non avranno specificati dall'utente $ PATH aggiunte come /usr/local/bin, che è dove il binario grugnito è. Puoi specificare il percorso completo o correggere $ PATH nel tuo hook pre-commit aggiungendo questo dopo i commenti principali: PATH="/usr/local/bin:$PATH"

+0

Questo ha funzionato, Sindre. Grazie per l'aiuto! – ChrisCast

+0

Anche per me, grazie! – renatoargh

+0

Ho avuto un problema simile durante l'esecuzione di hook pre-commit con SourceTree. Il terminale eseguiva "grunt test" dal pre-commit, ma non da SourceTree. Grazie..! ha funzionato. –

-1

come una semplice soluzione che specifica il percorso assoluto completo per grunt dovrebbe funzionare. se è necessario configurare un maggior numero di ambienti, è necessario esaminare in che modo l'applicazione github crea l'ambiente per gli hook.

1

Se vuoi eseguire uno script che ottiene il tuo ambiente ($PATH, ecc.) Devi cambiare la prima linea dello script da questo:

#!/bin/sh 

a:

#!/usr/bin/env sh 

quindi chiamare grunt senza il percorso codificato duro.

In questo modo, se il percorso del tuo eseguibile cambia in futuro o è diverso su altre macchine, lo script funzionerà ancora. /usr/bin/env otterrà l'ambiente dell'utente che lo script è in esecuzione come. Questo è davvero utile in luoghi in cui alcune persone usano diversi gestori di pacchetti ma hanno bisogno di eseguire gli stessi script. Altrimenti si potrebbe finire con un sacco di logica alla ricerca di applicazioni che potrebbero essere evitate in base a uno $PATH correttamente compilato.

+1

non ha funzionato per me su mac. –

+0

@coding_idiot Puoi anche provare a cambiare 'sh' in' bash' per vedere se questo preleva il tuo percorso. Ho usato solo 'bash' come questo, ma ho messo' sh' lì perché era la shell che stavi usando originariamente. –

6

Se si utilizza sourcetree (su Mac) e si dispone di hook pre-commit e pre-push, aprire sourcetree con la riga di comando anziché aprirlo direttamente, con il seguente comando.

open /Applications/SourceTree.app/Contents/MacOS/SourceTree 

Ora i ganci funzioneranno quando si tenta di commettere e spingere. Sono sicuro che funzioni anche per l'applicazione github. risposta eccellente

+0

WOW. Questo è incasinato. Hai segnalato questo bug ad Atlassian? –

+0

https://answers.atlassian.com/questions/15698572/answers/41458849?flashId=1990845935 –

+2

Nella versione più recente dell'albero dei sorgenti, funziona. Non è necessario aprire il suddetto mod. –

0

Sindre Sorhus':

applicazioni GUI su OS X non carica la roba in .bashrc/.bash_profile, il che significa che non avranno specificati dall'utente $ aggiunte path Ti piace /usr/local/bin , che è dove si trova il binario grunt.O si possibile specificare il percorso completo o fissare il $ PATH nel-commit pre gancio, per aggiungendo questo dopo i primi commenti: PATH="/usr/local/bin:$PATH"

Nel mio caso questo non ha funzionato perché sto usando Node Version Manager, che memorizza diverse versioni di Node e semplifica l'aggiornamento e il passaggio delle versioni di Node. Memorizza i moduli del nodo per ogni versione del nodo in un file separato. Ecco il codice che ho usato per aggirare questo problema:

#!/usr/bin/env bash 

PATH="/usr/local/bin:$PATH" 

if [ -f $HOME/.nvm/nvm.sh ] 
then 
    . $HOME/.nvm/nvm.sh 
    PATH="$HOME/.nvm/versions/node/$(nvm current)/bin:$PATH" 
fi 

Questo controlla per NVM, e se esiste, lo carica e lo utilizza per trovare il percorso ai moduli dei nodi per la versione attualmente utilizzata del Nodo.

+0

Dove dovrebbe essere collocato questo codice? Come/quando viene lanciato? – sompylasar

Problemi correlati