有没有办法设置git,以便它从远程仓库中侦听更新,并且只要有变化就会拉出来?用例是我想使用git部署一个Web应用程序(所以我得到了部署应用程序的版本控制),但是想把“中央”git repo放在Github上,而不是放在Web服务器上(Github的界面真是太棒了) 。
有没有人得到这个工作? Heroku是如何做到的?我的Google-fu未能给我任何相关结果。
答案 0 :(得分:39)
Git有“钩子”,可以在其他动作之后执行的动作。你似乎在寻找的是“后接收钩”。在github管理员中,您可以设置一个后期接收网址,每当有人推送您的仓库时,该网址都会被点击(有效负载包含刚推送的数据)。
对于它的价值,我不认为自动拉动是一个好主意 - 如果错误被推到你的分支怎么办?我会使用像capistrano
(或等效的)这样的工具。
答案 1 :(得分:16)
在unix上,你可以在你的机器上创建调用“git pull”(每天或每周或其他)的cron作业。在Windows上,你可以使用任务调度程序或“AT”命令来做同样的事情。
答案 2 :(得分:3)
有像Jenkins或Bamboo这样的持续集成程序,可以检测提交和触发操作,如构建,测试,打包和部署。他们做你想做的事,但他们很重要的依赖,很难配置,最后他们可能会对git存储库使用定期检查,这会产生与每分钟调用gron pull一样的效果。
答案 3 :(得分:1)
您可以通过执行以下操作来编写脚本来实现此目的:
答案 4 :(得分:0)
我知道这个问题有点旧,但你可以使用windows日志和git使用webhook和php自动调整你的项目(假设你的项目涉及一个网络服务器。 在这里看到我的要点: https://gist.github.com/upggr/a6d92e2808e9628ebe0d01fd93569f4a
答案 5 :(得分:0)
正如一些人在尝试后注意到的那样,如果您使用 php exec()
,结果证明解决权限不是那么简单。
执行命令的用户可能不是您自己的用户,而是 www-data
或 apache
。
如果您有 root/sudo 访问权限,我建议您阅读此 Jonathan's blog post
我的解决方案有点创意。我注意到我可以在我的用户名下创建一个带有循环的脚本,并且 git pull 可以正常工作。但是,正如其他人所指出的,这会带来每 60 秒运行大量无用 git pull
的问题。
这里是使用 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 software
:
否认:
./gitpull.sh &
将其置于后台disown -h %1
进行分离,您可以注销屏幕:
screen
./gitpull.sh
control+a d
以分离,您可以注销此解决方案很简单,您可以避免弄乱密钥、密码、权限、sudo、root 等,还可以防止脚本用无用的 git pull
淹没您的服务器。
它的工作方式是检查文件GITPULLMASTER
是否存在;如果没有,就回去睡觉。仅当它存在时,才执行 git pull
。
您可以更改行:
mv GITPULLMASTER GITPULLMASTER.
日期 +"%Y%m%d%H%M%S"`
到
rm GITPULLMASTER
如果您更喜欢更干净的目录。但我发现让拉取日期注册(和未跟踪)对调试很有用。