2012-05-08 10 views
19

Ho un repository non nullo sul mio server (dirs/home/andrew/web e /home/andrew/web/.git), set receive.denyCurrentBranch di ignorare e ha creato post-ricezione gancio:Git checkout in hook post-ricezione: "Not a git repository". ""

#!/bin/sh 
GIT_WORK_TREE=/home/andrew/web git checkout -f 

Quando eseguo sh .git/ganci/post-ricezione, tutto funziona bene. Ma quando spingo dal mio PC ottengo questo errore:

remote: fatal: Not a git repository: '.' 

C'è un modo come posso risolvere questo problema? E alla fine, senza dover cambiare il repository?

Grazie

EDIT: Ecco il mio nuovo gancio post-ricezione. Perché è come questo è stato descritto nella risposta accettata.

echo "\nChecking out $PWD" 
GIT_DIR=/home/andrew/web/.git 
GIT_WORK_TREE=/home/andrew/web git checkout -f 
+0

Quale comando si usa per spingere e in particolare: qual è l'url remoto? – Simon

+0

@Simon Io uso "git push origin" e il mio URL remoto è "[email protected]: web". – A123321

+0

Puoi provare il percorso completo '[email protected]:/home/andrew/web', ma penso che il vero problema è che il repository remoto non è nullo. Potresti provare a forzare il push: 'git push -f origin' – Simon

risposta

25

[Modifica, Feb 2017: questa vecchia risposta viene comunque colpita un po ', quindi aggiungiamo alcune note. (1) Questo tipo di aggiornamento dal vivo è spesso una cattiva idea: assicurati di sapere perché lo stai facendo e che non rovinerai il tuo lavoro. (2) In Git dal 2.3, ora è possibile configurare receive.denyCurrentBranch su updateInstead, oltre a un tweak di hook in Git 2.4 e versioni successive. Per ulteriori dettagli, vedere the git config documentation.]

Il gancio di post-ricezione viene eseguito con $GIT_DIR impostato su .. Questo fa sì che git cerchi ./HEAD, ./refs/heads/master, ecc. Anziché .git/HEAD, .git/refs/heads/master, ecc. Ma, dato che non fai nulla per cambiare $PWD nel gancio (come mostrato in ogni caso), il gancio verrà eseguito nel .git sottodirectory (/home/andrew/web/.git), e quindi questo errore è abbastanza misterioso: . sarà in effetti un repository git valido.

Un trucco standard che evita l'hard-coding del nome del percorso è quello di utilizzare cd ..; git checkout -f come hook di post-ricezione. Qui è dove l'impostazione di $GIT_DIR diventa un problema, perché dopo cd .. l'hook è in esecuzione (sempre ipotizzando questo caso) /home/andrew/web e, naturalmente, a quel punto, $GIT_DIR deve essere .git anziché .. La soluzione standard è semplicemente quella di disinserire GIT_DIR (anche impostarlo su .git).

Il gancio di post-ricezione, come mostrato, funziona bene per me, tuttavia (con le opportune modifiche del percorso hard-coded). Poi di nuovo sto spingendo da una macchina simile a Unix, non da un PC. È possibile che succeda qualcos'altro, che cambia le directory dalla sottodirectory .git? Puoi fare qualcosa come echo running in $PWD nel gancio per vedere dove sei.

+1

GRAZIE! Ho passato anni con questo, nessuno è stato in grado di spiegare. – A123321

+2

Impostando '$ GIT_DIR' in' .git' e 'cd'ing nella directory ha funzionato per me. Grazie! – bkconrad

+3

'Unset GIT_DIR' nella mia post-ricezione ha funzionato per me. –