Volevo farlo in Windows e ho scoperto che il modo migliore era usare Directory Monitor per verificare la presenza di modifiche, quindi quando ha rilevato una modifica è stato eseguito:
Programma: cmd.exe
Params: /CC:\pathToBatchFile.bat
Quel file batch conteneva:
c:
cd c:\gitRepoDirectory\
(if exist "%PROGRAMFILES(X86)%" (
"%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage"
) else (
"%PROGRAMFILES%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage"
))
Ho anche provato ad avere un altro comando lì per aggiungere file ( "%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"
), ma non credo di averlo fatto funzionare correttamente.
Ho anche creato un hook post-commit contenente:
#!/bin/sh
git.exe pull -v --progress "origin"
git.exe push --progress "origin" master:master
curl.exe -s https://webserverdomain.com/updateFromGitHook.x?r=repoName
(Se ci fossero stati dei conflitti, questo avrebbe interrotto la spinta e interrotto la spinta, ma non c'era alcun modo chiaro per dire che era successo - alla fine abbiamo abbandonato l'intera idea a causa di questo difetto.)
Quel comando curl disse al mio server che doveva fare un pull sul codice. Tutto ciò che era necessario per gestirlo in php era:
<?
$r = $_GET['r'];
if (!empty($c)) {
//use system instead of exec if you want the output to go back to the git client
exec("cd /path/to/repo/parent/$r; sudo git reset --hard HEAD; sudo git pull;");
echo "\n\nServer: Updated\n\n";
} else {
echo "\n\nServer: UPDATE FAILED\n\n";
}
?>
L'unico problema era che doveva essere eseguito dall'utente root anziché dall'utente apache, quindi dovevo anche creare un file /etc/sudoers.d/
contenente:
www-data ALL = NOPASSWD: /usr/bin/git
Per me, penso che abbia funzionato abbastanza bene. Directory Monitor può essere configurato per essere eseguito all'avvio e iniziare a essere ridotto a icona e può guardare diverse cartelle