2010-02-22 9 views
12

Stiamo usando git con un repository centrale (utilizzando Gitosis). Ho creato un hook di post-ricezione per generare un'e-mail alla mailing list dev ogni volta che vengono apportate modifiche al repository centrale e per generare documentazione dalla cartella della documentazione nel repository git.Git post-ricezione non funzionante

Pertanto, in ~ git/ho una directory, la chiameremo 'a' che contiene un clone del repository git. Il post-ricezione gancio assomiglia:

#!/bin/bash 
cd ~git/repositories/a.git 
. ~git/post-receive-email &> /dev/null 
(cd ~git/a && git pull &> ~git/pull_log.log && php ~git/a/scripts/generate_markdown_documentation.php &> ~git/doc_log.log) 

Lo script di posta elettronica è in funzione, ma la generazione di documentazione non è. Il contenuto di pull_log.log è:

fatal: Not a git repository: '.' 

Il che mi fa pensare che non sta cambiando nella directory corretta in linea 5 dello script di cui sopra. Ho sbagliato? Come posso farlo funzionare?

Modifica: Ho aggiornato il gancio di post-ricezione come suggerito nelle risposte. Lo script è ora:

#!/bin/bash 
function die { 
    echo "$*" >&2; exit 1 
} 

function checkgit { 
    [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir" 
} 


cd ~git/repositories/a.git 
. ~git/post-receive-email &> /dev/null 
(set -x 
checkgit ~git/a 
cd ~git/a 
checkgit . 
pwd 
git pull 
php ~git/a/scripts/generate_markdown_documentation.php) 

e ottengo il seguente output da git push:

+ checkgit /var/git/a 
+ '[' -d /var/git/a/.git ']' 
+ cd /var/git/a 
+ checkgit . 
+ '[' -d ./.git ']' 
+ pwd 
/var/git/a 
+ git pull 
fatal: Not a git repository: '.' 
+ php /var/git/a/scripts/generate_markdown_documentation.php 

Qualsiasi ulteriore aiuto?

Oh, e se faccio funzionare lo scritto io stesso, funziona (l'eseguo dicendo ganci/post-ricevono)

scoperto il problema, grazie alla serverfault - in pratica, le variabili di ambiente e GIT_DIRGIT_WORK_TREE sono impostati quando il gancio scorre, e questi influenzano il git tirare in modo negativo. Disattivare le variabili risolve il problema.

+2

Cambia 'git pull' in' pwd' e guarda cosa appare nel registro. –

+0

Oooh! Cattiva. +1 per rintracciare il problema e ucciderlo! –

+0

Come hai trovato il file pull_log.log? Non so dove sono memorizzati i registri ... – munmunbb

risposta

3

avete bisogno di più la diagnostica, per esempio,

function die { 
    echo "$*" >&2; exit 1 
} 

function checkgit { 
    [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir" 
} 

A questo punto, nella subshell subito dopo la parentesi, si può provare a roba come

set -x # show exactly what's executed (writes to stderr) 
checkgit ~git/a 
cd ~git/a && checkgit . && git pull ... 

Si potrebbe anche considerare riorientare l'intera stderr della subshell, ad esempio

(...) 2>/tmp/mydiagnosis$$.log 

(Questa è una misura temporanea ed è OK solo se non ci sono informazioni riservate nei log.)


OK Silas, le tue informazioni aggiuntive escludono molte possibilità scomode. Sono quasi alla fine del mio git fu, ma qui ci sono alcune altre cose da provare:

  1. andare in ~git/a e vedere se si può fare git pull a mano. Questo dovrebbe fallire.
  2. Ottenuto in ~git/a ed eseguito git status. Questo dovrebbe anche fallire. Se così non fosse, allora git ti sta dando un messaggio di errore molto brutto.

Se entrambi i passaggi falliscono, ~git/a non è il clone che si pensava fosse.Rinominalo, crea un nuovo clone e vedi se riesci a far sì che il problema persista.

Se il primo passaggio riesce a mano, allora qualcosa di strano sta succedendo e io sono sconcertato.

Se il primo passaggio non riesce, ma il secondo ha successo, si può avere un problema con rami:

  • Forse Repo ~git/a è impostato al ramo sbagliato, e il vostro repo ha bisogno di un ramo che non ha . Prova git branch -a e vedi se vedi qualcosa di inaspettato.

  • Forse si dispone del ramo, ma non è associato correttamente a un repository remoto. A questo punto devi tuffarti nello ~git/a/.git/config, e non so davvero come spiegare cosa dovresti aspettarti di trovare lì. A quel punto avrete bisogno di un esperto di git reale; Suono solo uno in TV.

+0

Potresti dare un'altra occhiata? Ho aggiunto le informazioni richieste. – Silas

+1

@Silas: sono state aggiunte altre cose da provare. –

+0

Ho scoperto il vero problema: vedere la descrizione aggiornata sopra. – Silas

0

ho recentemente imbattuto in un problema simile e penso che è legato alle variabili di ambiente che Git set, in particolare la variabile $ GIT_DIR. Se hai quel set, tutti i comandi git su altri repository iniziano ad agire in modo strano. Fondamentalmente penso che l'esecuzione della tua git pull dentro l'hook debba essere invocata in un ambiente shell neutro che non ha quelle strane variabili e porta alla confusione git, anche se non ho ancora capito come farlo.

0

unset GIT_DIR è una soluzione che funziona per l'errore irreversibile che si sta vedendo.

Questo vale per tutti gli script in hook (il post-aggiornamento è un altro comune), che utilizza il comando git al suo interno. il comando git usa GIT_DIR da env invece che da pwd.

Vedere https://stackoverflow.com/a/4100577 per ulteriori spiegazioni.