ottenere "fatal: not a git repository: '.'" quando si utilizza un hook post-aggiornamento per eseguire 'git pull' su un altro repository


89

Sono nuovo in git quindi mi scuso (e per favore correggimi) se uso impropriamente la terminologia qui, ma farò del mio meglio.

Sto cercando di impostare un repository git (hub) e una copia funzionante del sito di sviluppo (prime) su un server web. Ho provato a modellarlo dopo questo articolo . Desidero che la copia di lavoro di sviluppo venga aggiornata ogni volta che viene eseguito il push del repository hub. Ho l'impressione che il gancio giusto per questo sia post-update, che ho creato in questo modo:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

Aggiornare

Quando invio le modifiche dal mio repository locale all'hub nudo, ottengo il seguente output dallo script post-aggiornamento:

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

Tuttavia, se inserisco SSH nel server come "siti" dell'utente ed eseguo questo script manualmente, funziona alla grande Qualche idea su cosa potrebbe andare storto con questo hook o script?

Risposte:


179

Ecco la sceneggiatura che alla fine ha funzionato. Penso che il bit che inizialmente mi mancava che gli impediva di funzionare in remoto fosse ilunset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info

18
Posso confermare, il disinserimento GIT_DIRrisolve il problema.
jmtd

16
Per coloro che vogliono capire perché: è perché git usa la variabile GIT_DIRinvece di PWD. cd-ing cambia il PWDnon il GIT_DIR. Ci deve essere un fallback in git da GIT_DIRa PWDse il primo non fosse disponibile.
zupa

La domanda è: perché git deve vedere che è necessario farlo per lo script hook (impostare GIT_DIR in modo che anche lo script abbia 'cd' altrove 'git qualunque' continuerà a funzionare)? Personalmente sceglierei che Git non faccia questo tipo di magia.
Steven Haryanto

2
La ragione di ciò è che Git applica alcune variabili di ambiente a tutti i comandi principali di git.
Casey

Cosa succede quando c'è un conflitto di unione dopo git pull?
lolololol del


0

Nonostante ciò, GIT_DIR non impostato funziona.

il problema si verifica quando imposti GIT_DIR in modo errato da qualche altra parte.

puoi semplicemente aggiungerlo invece: GIT_DIR = .git / Funzionerà


0

Nel mio caso avevo specificato un albero funzionante, e questo si rompe su alcuni comandi, come pull(o più precisamente fetch).

Per annullare l'impostazione dell'albero di lavoro se è nella tua configurazione git è tramite:

git config --unset core.worktree

(Ci sono altri modi per impostare un albero di lavoro)

Importante da notare,

Non c'è quasi nessun cambiamento del tuo problema a meno che tu stesso non abbia scavato questo buco intorno a te usando un albero di lavoro personalizzato in primo luogo.

Banter:

Ciò implica per me che gli interni di git usano percorsi relativi all'albero di lavoro + .git/in alcuni casi. Nella mia esperienza gli alberi di lavoro non sono ben supportati, tranne che per le parti più fondamentali di git. Non ho sperimentato a fondo, Git probabilmente si comporterebbe se impostassi correttamente la variabile di configurazione della directory git, con cui non ho giocato.


-1

Probabilmente hai un problema con le autorizzazioni. Non sono sicuro di come hai configurato il tuo repository git nudo, ma se è in esecuzione sotto l' gitutente, assicurati che l' gitutente sia autorizzato a eseguire l'operazione git pullnella directory del tuo progetto.

Facoltativamente, prova questo per scoprire quale utente sei quando l'hook viene eseguito:

echo `whoami`

se eseguo ssh nel server come utente git posso usare git pull nella directory del mio progetto senza problemi. Io credo che è l'utente che deve essere in esecuzione lo script. Posso provare ad aggiungere la riga whoami allo script, ma dove va l'output di quello script quando viene eseguito come hook? Forse ho bisogno di inviare quell'output a un file di registro invece di echeggiare?
Ty W

Che cosa significa echo `whoami`fare quello whoaminon lo fa?
Christoffer Hammarström,

L'output su stdout da uno script hook è visibile al telecomando che esegue l'azione. Oppure, in altre parole, se dici "git push", l'output di un hook sul telecomando verrà visualizzato nel tuo stdout.
ebneter

sì, l'ho notato mentre giocavo con le cose. molto conveniente :)
Ty W
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.