Git:从存储库中自动拉出?

时间:2012-04-02 14:38:11

标签: git deployment

有没有办法设置git,以便它从远程仓库中侦听更新,并且只要有变化就会拉出来?用例是我想使用git部署一个Web应用程序(所以我得到了部署应用程序的版本控制),但是想把“中央”git repo放在Github上,而不是放在Web服务器上(Github的界面真是太棒了) 。

有没有人得到这个工作? Heroku是如何做到的?我的Google-fu未能给我任何相关结果。

6 个答案:

答案 0 :(得分:39)

Git有“钩子”,可以在其他动作之后执行的动作。你似乎在寻找的是“后接收钩”。在github管理员中,您可以设置一个后期接收网址,每当有人推送您的仓库时,该网址都会被点击(有效负载包含刚推送的数据)。

对于它的价值,我不认为自动拉动是一个好主意 - 如果错误被推到你的分支怎么办?我会使用像capistrano(或等效的)这样的工具。

答案 1 :(得分:16)

在unix上,你可以在你的机器上创建调用“git pull”(每天或每周或其他)的cron作业。在Windows上,你可以使用任务调度程序或“AT”命令来做同样的事情。

答案 2 :(得分:3)

有像Jenkins或Bamboo这样的持续集成程序,可以检测提交和触发操作,如构建,测试,打包和部署。他们做你想做的事,但他们很重要的依赖,很难配置,最后他们可能会对git存储库使用定期检查,这会产生与每分钟调用gron pull一样的效果。

答案 3 :(得分:1)

您可以通过执行以下操作来编写脚本来实现此目的:

  1. 获取远程HEAD提交ID
  2. 将id与本地HEAD进行比较
  3. 如果他们不同,请使用git pull并使用deploy命令
  4. 如果相同,则传递
  5. 编写一个cron作业来执行脚本(注意:防止重复执行。)

答案 4 :(得分:0)

我知道这个问题有点旧,但你可以使用windows日志和git使用webhook和php自动调整你的项目(假设你的项目涉及一个网络服务器。 在这里看到我的要点: https://gist.github.com/upggr/a6d92e2808e9628ebe0d01fd93569f4a

答案 5 :(得分:0)

正如一些人在尝试后注意到的那样,如果您使用 php exec(),结果证明解决权限不是那么简单。

执行命令的用户可能不是您自己的用户,而是 www-dataapache

如果您有 root/sudo 访问权限,我建议您阅读此 Jonathan's blog post

当您不被允许/无法解决权限时

我的解决方案有点创意。我注意到我可以在我的用户名下创建一个带有循环的脚本,并且 git pull 可以正常工作。但是,正如其他人所指出的,这会带来每 60 秒运行大量无用 git pull 的问题。

这里是使用 webhooks 实现更精细解决方案的步骤:

  • 部署密钥:转到您的服务器并输入: ssh-keygen -t rsa -b 4096 -C "deploy" 生成新的部署密钥,不需要写权限(只读更安全)。将公钥复制到您的 github 存储库设置中的“部署密钥”下。
  • Webhook:转到您的存储库设置并创建一个 Webhook。让我们假设有效载荷地址是 http://example.com/gitpull.php
  • Payload:创建一个包含以下代码示例的 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

如果您更喜欢更干净的目录。但我发现让拉取日期注册(和未跟踪)对调试很有用。