2010-08-22 13 views
16

Ho un repository git centrale impostato usando gitolite.Chiamare 'git pull' da un hook post-update git

Voglio impostare un gancio in modo che ogni volta che un utente spinge al repository, esegue un pull altrove seguito da alcuni test automatici.

Finora, voglio solo eseguire il pull.

Nella directory ganci ho creato i seguenti nomi script di post-aggiornamento:

#!/bin/sh 
cd /home/git/www/epicac 
git pull 

Quando invoco questo script utilizzando ./post-update, lo fa esattamente quello che voglio.

Tuttavia, ogni volta che viene richiamato automaticamente come aggancia, ottengo: fatale: Non un repository git: '.'

Qualche idea sul perché questo potrebbe accadere?

+2

appena aggiunto l'env -i git pull' soluzione '. – VonC

+0

hanno esattamente lo stesso problema, anche dopo 7 anni –

risposta

25

Avete varie diagnostica per eseguire come suggerito in questo SO answer.

In particolare, check out the the value of GIT_DIR and GIT_WORK_TREE.

Mentre il gancio è in funzione, GIT_DIR e (se il worktree non si può dedurre da GIT_DIR) GIT_WORK_TREE sono impostati.
Ciò significa che il pull non verrà eseguito con il repository nella directory in cui è stato modificato.


Vedi anche post sul blog Using Git Inside a Git Hook:

Alla fine abbiamo ottenuto il nostro guru di Linux più e ha notato che l'ambiente in cui l'utente viene eseguito git è totalmente diverso quando all'interno di un gancio.
Gitolite fa un sacco di cose per l'env, ma quello che ci stava rovinando era l'impostazione del GIT_DIR.
Dopo abbiamo capito che fuori, la soluzione è stata semplice come:

ENV.delete 'GIT_DIR' 

nel nostro script ruby ​​che viene attivato dalla 'post-receive' gancio.


Stessa cosa in Git Tip: Auto update working tree via post-receive hook, ma con un modo elegante di questo:

La soluzione?
Si scopre il gancio post-receive inizia con la variabile ambiente GIT_DIR impostare la cartella repo/.git, quindi non importa quale strada si 'cd' in essa cercherà sempre di eseguire qualsiasi seguenti comandi git lì.
fissaggio questo è semplicemente una questione di disabilitare i GIT_DIR
(grazie a Ulrich Petri per la elegante env -i soluzione):

#!/bin/sh 
cd .. 
env -i git reset --hard 
7

Come su come specificare la --git-dir.

#!/bin/sh 
cd /home/git/www/epicac 
git --git-dir=.git pull 
0

Questo dovrebbe fare il trucco in una sola riga:

git -C /home/git/www/epicac pull