tôi muốn làm điều này trong các cửa sổ, và thấy cách tốt nhất là sử dụng Directory Monitor để kiểm tra những thay đổi sau đó khi nó phát hiện một sự thay đổi có nó chạy:
Chương trình: cmd.exe
Params: /CC:\pathToBatchFile.bat
Đó batch file chứ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"
))
Tôi cũng đã cố gắng có lệnh khác trong đó để thêm các tập tin ("%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"
), nhưng tôi không nghĩ rằng tôi đã làm việc đó đúng cách.
tôi cũng thực hiện một cam kết bài móc chứa:
#!/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
(Nếu có bất kỳ xung đột sau đó nó sẽ hủy bỏ việc kéo và hủy bỏ việc đẩy mạnh, nhưng không có cách nào rõ ràng để nói rằng có đã xảy ra - cuối cùng, chúng tôi đã từ bỏ toàn bộ ý tưởng vì một lỗ hổng này.)
Lệnh curl đó nói với máy chủ của tôi rằng nó cần thực hiện việc kéo mã. Tất cả những gì là cần thiết để xử lý nó trong php là:
<?
$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";
}
?>
Vấn đề duy nhất với điều đó là nó cần thiết để được điều hành bởi người dùng root thay vì người dùng apache, vì vậy tôi cũng đã phải thực hiện một tập tin trong /etc/sudoers.d/
chứa :
www-data ALL = NOPASSWD: /usr/bin/git
Đối với tôi, tôi nghĩ rằng nó hoạt động khá chắc chắn. Directory Monitor có thể được cấu hình để chạy khi khởi động và bắt đầu thu nhỏ, và nó có thể xem nhiều thư mục khác nhau
Sẽ dễ dàng hơn khi sử dụng hệ thống tệp phiên bản: http://en.wikipedia.org/wiki/Versioning_file_system –
SparkleShare khá ấn tượng về điều đó. – theode