Quería hacer esto en Windows, y encontré que la mejor manera era usar Directory Monitor para verificar los cambios y luego, cuando detectó un cambio, lo ejecuté:
Programa: cmd.exe
Parámetros: /CC:\pathToBatchFile.bat
Ese archivo por lotes contenía:
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"
))
También intenté tener otro comando allí para agregar archivos ( "%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"), pero no creo que haya funcionado correctamente.
También hice un gancho posterior a la confirmación que contiene:
#!/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
(Si hubiera algún conflicto, entonces abortaría el tirón y el empuje, pero no había ninguna forma clara de saber que había sucedido; al final, abandonamos toda la idea debido a este defecto).
Ese comando curl le dijo a mi servidor que necesitaba hacer una extracción del código. Todo lo que se necesitaba para manejarlo en 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";
}
?>
El único problema con eso era que tenía que ser ejecutado por el usuario root en lugar del usuario apache, por lo que también tuve que hacer un archivo que /etc/sudoers.d/contenga:
www-data ALL = NOPASSWD: /usr/bin/git
Para mí, creo que funcionó bastante bien. Directory Monitor se puede configurar para ejecutarse al inicio y comenzar minimizado, y puede ver varias carpetas diferentes