有没有办法设置Git监听远程仓库的更新,并在有变更时拉取更新?我的需求是使用Git部署Web应用(这样我就可以对已部署应用进行版本控制),但我希望将“中央”Git仓库放在GitHub上,而不是Web服务器上(因为GitHub的界面真心好看)。
有人做过类似的事情吗?Heroku是如何实现的?我的谷歌搜索失败了,没有给我任何相关的结果。
有没有办法设置Git监听远程仓库的更新,并在有变更时拉取更新?我的需求是使用Git部署Web应用(这样我就可以对已部署应用进行版本控制),但我希望将“中央”Git仓库放在GitHub上,而不是Web服务器上(因为GitHub的界面真心好看)。
有人做过类似的事情吗?Heroku是如何实现的?我的谷歌搜索失败了,没有给我任何相关的结果。
Git有“钩子”功能,可以在其他操作后执行。你似乎正在寻找的是“post-receive hook”。在github管理界面中,您可以设置一个post-receive url,每当有人向您的存储库推送内容时,它将被访问(携带有关刚刚推送内容的数据负载)。
就我个人而言,我认为自动拉取不是一个好主意——如果错误的内容被推送到您的分支,会发生什么情况?我建议使用像capistrano
(或类似工具)这样的工具来处理这些事情。
在类Unix系统上,您可以创建一个cron工作,以调用您的机器上的 "git pull"(每天或每周或任何其他时间)。在Windows上,您可以使用任务计划程序或“AT”命令执行相同的操作。
while true; do git pull; sleep 10; done
。这将每隔10秒执行一次git pull
操作。 - JakeD有一些持续集成程序,如Jenkins或Bamboo,它们可以检测提交并触发构建、测试、打包和部署等操作。它们可以满足你的需求,但是它们依赖重,配置难度大,最终可能会对git仓库进行周期性检查,这与通过cron每分钟调用git pull具有相同的效果。
正如一些人在尝试后注意到的那样,如果您使用php exec()
,解决权限问题并不简单。
执行命令的用户可能不是您自己,而是www-data
或apache
。
如果您拥有root/sudo访问权限,我建议您阅读这篇Jonathan的博客文章
我的解决方案有点创意。我注意到我可以使用循环在我的用户名下创建一个脚本,然后git pull就可以正常工作。但是,正如其他人指出的那样,这带来了运行大量无用git pull
的问题,比如每60秒运行一次。
因此,以下是使用webhooks更为精细的解决方案步骤:
ssh-keygen -t rsa -b 4096 -C“deploy”
以生成新的部署密钥,不需要写入权限(只读更安全)。将公钥复制到您的 GitHub 存储库设置中,在“部署密钥”下方。http://example.com/gitpull.php
git pull
,而是提醒以下脚本需要进行pull
。这里是简单代码:gitpull.php:
<?php
/* Deploy (C) by DrBeco 2021-06-08 */
echo("<br />\n");
chdir('/home/user/www/example.com/repository');
touch(GITPULLMASTER);
?>
/home/user/gitpull.sh
,并使用以下代码:gitpull.sh
#!/bin/bash
cd /home/user/www/example.com/repository
while true ; do
if [[ -f GITPULLMASTER ]] ; then
git pull > gitpull.log 2>&1
mv GITPULLMASTER GITPULLMASTER.`date +"%Y%m%d%H%M%S"`
fi
sleep 10
done
有两种方法可以实现这个目的,第一种比较简单,不需要安装 screen 软件
:
disown:
./gitpull.sh &
将其放入后台disown -h %1
进行分离,然后您可以注销screen:
screen
./gitpull.sh
control+a d
进行分离,然后您可以注销这个解决方案很简单,您可以避免处理密钥、密码、权限、sudo、root 等问题,还可以防止脚本向服务器发送无用的 git pull
命令。
它的工作方式是检查文件GITPULLMASTER
是否存在;如果不存在,则继续睡觉。只有当它存在时,才执行git pull
。
您可以更改以下行:
mv GITPULLMASTER GITPULLMASTER.
date +"%Y%m%d%H%M%S"`
为
rm GITPULLMASTER
如果您喜欢一个更清洁的目录结构。但是我发现让拉取日期注册(且未跟踪)对调试很有用。
我知道这个问题有点老了,但是你可以使用Windows日志和Git来使用Webhook和PHP自动拉取你的项目(假设你的项目涉及到Web服务器)。 在这里查看我的代码片段: https://gist.github.com/upggr/a6d92e2808e9628ebe0d01fd93569f4a