Git Hook - 推送到github后使服务器拉出

时间:2014-06-24 08:48:56

标签: git github hook

我有一个本地存储库,我在我的实时服务器上设置了另一个存储库:

www.site.com/projects/ProjectA

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

我一直在阅读关于钩子的文章,我找不到一个非常简单的例子来说明我需要的东西。所有教程都是为高级功能而设计的。

我做了什么

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

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

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

    “钩子”代码是“./ usr / share / git-core / contrib / hooks / post-receive-email”,我不明白它是做什么的。我查看了其他钩子示例,我看到其中一些人有熟悉的命令,如: exec git update-server-info 所以我想我可以编写自己的命令。所以我写了 git pull ,保存了它并做了更改 - 提交 - 再次从我的本地仓库推送。结果和以前一样。然后我尝试了 exec git pull 。同样的事情。

    我的问题是 - 我做错了什么,第二个问题是,为什么这个功能没有简单的教程,因为这似乎是最常见的场景之一。谢谢!

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么在推送到GitHub之后,您希望服务器上的存储库可以拉动。

因此,在从本地存储库推送之后,必须通知服务器。 服务器上的post-receive-hook不是,那是什么。在收到某些内容后调用它,但是对github的推送并不会使服务器收到任何内容。 (见https://www.kernel.org/pub/software/scm/git/docs/githooks.html

要通知服务器,我会使用" post-update"钩在远程存储库上。但是当你的遥控器在GitHub上时,这可能是一个问题。因为我不是GitHub用户,所以我不知道该怎么做。试试" Webhook"或者"服务"在存储库的settings-tab中(如果您拥有存储库)。

如果GitHup上的挂钩不能解决问题:

正如你的建议,你的服务器上有ssh-access,我认为它是某种linux。然后你可以编写一个小脚本来更新server-repo,将它放在服务器上并在每次推送后通过ssh执行它。 我不知道在推送之后在本地仓库上调用的任何钩子,所以也许你应该编写另一个脚本,如果推送成功则执行push并调用ssh-command。 如果您使用linux系统,我可以帮助您使用脚本。

你在服务器上使用post-receive-hook做的是,在你推送到服务器之后执行了git pull,但你正在推送到GitHub。

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

答案 1 :(得分:0)

即使经过多年,也只是看到了答案。

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

参考:Webhooks

我在项目中使用了另一种实现方式:

假设〜/ example是你的项目public / 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

以上将在~/example/.git文件夹中创建一个简单的git仓库。添加一个post-receive可执行挂钩并在示例目录中执行checkout。

在本地回购:

$ git remote add server ssh://my_user@my_server.com:/absolute_path/example/.git/
$ git push server +master:refs/heads/master

这适合我。我可以在需要时推送,还原提交。

参考:Server repository