Chciałem to zrobić w systemie Windows i stwierdziłem, że najlepszym sposobem jest użycie Monitora katalogów do sprawdzenia zmian, a następnie po wykryciu zmiany uruchom:
Program: cmd.exe
Parametry: /CC:\pathToBatchFile.bat
Ten plik wsadowy zawierał:
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"
))
Próbowałem też mieć tam inne polecenie dodawania plików ( "%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"), ale nie sądzę, że działało poprawnie.
Zrobiłem również hak po zatwierdzeniu zawierający:
#!/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
(Gdyby były jakieś konflikty, przerwałoby to wyciąganie i przerwanie pchania, ale nie było żadnego jasnego sposobu, aby to stwierdzić - w końcu porzuciliśmy cały pomysł z powodu tej jednej wady).
To polecenie curl powiedziało mojemu serwerowi, że musi wyciągnąć kod. Wszystko, co było potrzebne do obsługi tego w php, to:
<?
$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";
}
?>
Jedynym problemem było to, że musiał być uruchamiany przez użytkownika root zamiast użytkownika apache, więc musiałem również zrobić plik /etc/sudoers.d/zawierający:
www-data ALL = NOPASSWD: /usr/bin/git
Myślę, że to działało całkiem solidnie. Directory Monitor można skonfigurować tak, aby działał przy starcie i uruchomieniu zminimalizowanym i może obserwować kilka różnych folderów