Eu queria fazer isso no Windows, e achei a melhor maneira de usar o Directory Monitor para verificar se havia alterações e, quando detectou uma alteração, execute:
Programa: cmd.exe
Parâmetros: /CC:\pathToBatchFile.bat
Esse arquivo em lotes continha:
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"
))
Também tentei ter outro comando lá para adicionar arquivos ( "%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"), mas acho que não funcionou corretamente.
Também criei um gancho pós-confirmação contendo:
#!/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 houvesse algum conflito, isso abortaria o impulso e o empurrão, mas não havia uma maneira clara de saber o que havia acontecido - no final, abandonamos toda a ideia por causa dessa falha.)
Esse comando curl disse ao meu servidor que ele precisava fazer um puxão no código. Tudo o que era necessário para lidar com isso no 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";
}
?>
O único problema com isso era que ele precisava ser executado pelo usuário raiz em vez do usuário apache, então eu também tive que criar um arquivo /etc/sudoers.d/contendo:
www-data ALL = NOPASSWD: /usr/bin/git
Para mim, acho que funcionou muito bem. O Directory Monitor pode ser configurado para executar na inicialização e iniciar minimizado, além de assistir a várias pastas diferentes