2011-10-04 6 views
7

Sto cercando di utilizzare il gancio post-commit seguente per la distribuzione su una particolare directory dopo ogni successo commit:Perché l'impostazione di GIT_WORK_TREE non funziona in un hook post-commit?

#!/bin/sh 
export GIT_WORK_TREE=/var/www/example/ 
export GIT_DIR=/home/mark/test/.git/ 
git checkout -f 

Tuttavia, dopo aver commesso ottengo il seguente errore:

$ git commit -m 'An example commit.' 
fatal: Unable to create '/var/www/example/.git/index.lock': No such file or directory 
[master 0938e48] An example commit. 

... come se l'impostazione GIT_WORK_TREE fosse ignorata. Perché l'impostazione di questa variabile d'ambiente sembra non funzionare? Sto usando git versione 1.7.4.1.

risposta

18

Il problema è che in post-commit ganci (e anche pre-commit, prepare-commit-msg e commit-msgt) la variabile GIT_INDEX_FILE ambiente è impostato .git/index. (Questo non è documentato nel githooks documentation, ma ho postato altrove about the settings of environment variables and the current directory in git hooks.)

L'effetto della variabile GIT_INDEX_FILE ambiente è descritto nella sezione VARIABILI AMBIENTE della pagina git uomo come:

GIT_INDEX_FILE

This environment [variable] allows the specification of an alternate index file. If not specified, the default of $GIT_DIR/index is used.

... e per qualche motivo, in questa situazione, GIT_INDEX_FILE viene utilizzato relativo a GIT_WORK_TREE.

per far funzionare il gancio come ci si aspetterebbe, non vi resta che disinserire GIT_INDEX_FILE, in modo che il gancio sarà simile:

#!/bin/sh 
unset GIT_INDEX_FILE 
export GIT_WORK_TREE=/var/www/example/ 
export GIT_DIR=/home/mark/test/.git/ 
git checkout -f 
+1

questo potrebbe essere utilizzato anche per rendere disponibili le opzioni worktree e gitdir lavorano su git scorta e altri comandi? 'git --worktree --gitdir ' sembra funzionare solo su determinati comandi. –

+0

@Adam Dymitruk: ho trovato che '--work-tree = DIRECTORY' e' --git-dir = DIRECTORY' funzionano in modo affidabile al di fuori degli hook indipendentemente dal comando, fintanto che io (a) li imposto entrambi, e (b) impostarli entrambi su percorsi assoluti, proprio per evitare di dover ricordare le regole confuse su come vengono calcolati l'albero di lavoro finale e la directory del repository ... –

+0

questo è al di fuori di un hook del tutto. un po 'di lavoro, altri no .. Dovrò confermare se alcuni di loro non funzionano a causa di percorsi relativi .. Ma sarebbe strano per quel tipo di comportamento visto che sto usando lo stesso percorso e sto cambiando il comando. –