[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.
Quale comando si usa per spingere e in particolare: qual è l'url remoto? – Simon
@Simon Io uso "git push origin" e il mio URL remoto è "[email protected]: web". – A123321
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