Git钩子-在我推到github后让服务器拉

Git钩子-在我推到github后让服务器拉,git,github,hook,Git,Github,Hook,我有一个本地存储库,并且在我的live server上设置了另一个存储库: www.site.com/projects/ProjectA 我想要实现的是非常简单的:在我推到GitHub之后,我希望www.site.com/projects/ProjectA上的存储库能够被拉出来,从而更新项目的实时版本,我的客户可以看到 我读了很多关于钩子的书,但我找不到一个简单的例子来说明我需要什么。所有教程都是针对高级功能编写的 我所做的 我已经完成了SSH访问设置 我在www.site.com/projec

我有一个本地存储库,并且在我的live server上设置了另一个存储库:

www.site.com/projects/ProjectA

我想要实现的是非常简单的:在我推到GitHub之后,我希望www.site.com/projects/ProjectA上的存储库能够被拉出来,从而更新项目的实时版本,我的客户可以看到

我读了很多关于钩子的书,但我找不到一个简单的例子来说明我需要什么。所有教程都是针对高级功能编写的

我所做的

  • 我已经完成了SSH访问设置
  • 我在www.site.com/projects/ProjectA上有一个远程存储库,是我用Putty登录并进行git克隆时创建的(此时我的本地repo、GitHub repo和服务器repo都是同步的)

  • 我将post-receive.sample从.git/hooks复制到www.site.com/projects/ProjectA/

  • 我将post-receive.sample重命名为post-receive
  • 在github中,我在repo设置/webhooks下创建了一个新的钩子,指向www.site.com/projects/ProjectA/post receive。我保留的所有其他设置都完好无损
  • 我做了一个本地更改,提交,推送。中心更新,挂钩显示新的最近交付。一切正常,但服务器存储库不会更新

    “hook”代码是“/usr/share/git-core/contrib/hooks/post-receive-email”,我不明白它的作用。我查看了其他钩子示例,发现其中一些具有熟悉的命令,如:exec git update server info,因此我想我可以编写自己的命令。因此,我编写了git pull,保存了它,并从本地repo再次执行了change-commit-push。结果和以前一样。然后我尝试了执行git pull。同样的事情


    我的问题是——我做错了什么,第二个问题是,既然这似乎是最常见的场景之一,为什么没有关于这个功能的简单教程呢。谢谢大家!

    如果我理解正确,那么在推送到GitHub之后,您希望服务器上的存储库被调用

    因此,在从本地存储库推送之后,您必须通知服务器进行拉送。 服务器上的post-receive钩子不是,这意味着什么。它在接收到某个内容后被调用,但推送到github不会使服务器接收任何内容。 (见附件)

    为了通知服务器,我将使用远程存储库上的“更新后”挂钩。但由于您的遥控器在GitHub上,这可能是个问题。因为我不是GitHub用户,所以我不知道该怎么做。尝试存储库设置选项卡中的“Webhook”或“服务”(如果您拥有存储库)

    如果GitHup上的钩子不起作用:

    正如您所建议的,您可以在服务器上使用ssh访问,我认为这是某种linux。然后您可以编写一个小脚本来更新服务器repo,将它放在服务器上,并在每次推送之后通过ssh执行它。 我不知道有任何钩子在推送之后在本地repo上被调用,因此,如果推送成功,您可能应该编写另一个脚本来执行推送并调用ssh命令。 如果您使用linux系统,我可以帮助您编写脚本

    您在服务器上使用post接收钩子所做的是,在您推送到服务器之后执行git pull,但您推送到GitHub


    我希望这能解释为什么你的方法不起作用。

    只是多年后仍然没有得到答案

    Webhook要求您在服务器上设置HTTP POST侦听器。您可以在项目中添加http路由并执行适当的拉操作

    参考:

    我在项目中使用了一种替代实现:

    假设~/example是您的项目公共/www文件夹。 Ssh连接到您的服务器:

    $ cd ~/example && mkdir .git && cd .git && git init --bare
    $ cat > hooks/post-receive << EOF
    > #!/bin/sh
    > GIT_WORK_TREE=~/example git checkout -f
    > EOF
    $ chmod +x hooks/post-receive
    
    这对我很有效。我可以在需要的时候推送、回复或提交


    参考资料:

    谢谢您的回答。我希望有一个解决办法,因为它看起来相当简单。我可以使用ssh登录,每次都从服务器上执行git pull,但这很烦人,而且项目的所有参与者都不能访问服务器,所以每次他们推送某个东西时我都必须这样做,所以这不是一个选项。如果项目中有多个人,任何基于他们本地repo的解决方案都是不可行的。在这种情况下,您必须在远程回购上使用挂钩。你试过网络钩子吗?我在网络钩子上搜索过。看起来您必须运行一个web服务器来接收消息,然后启动服务器。这不应该太难。请参阅并编写一个php脚本,用于拉取repo。这应该是一个大约5到10行的脚本。看来没有别的可能了。我要多读一些书。这应该没有那么困难。我不知道为什么没有更直接的方法。谢谢你的帮助,但我得推两下?一个到github,另一个到服务器?
    $ git remote add server ssh://my_user@my_server.com:/absolute_path/example/.git/
    $ git push server +master:refs/heads/master