Git post-receive hook无效

时间:2011-02-09 21:38:22

标签: git curl hudson githooks git-post-receive

我的设置是一个Windows XAMPP服务器,启用了cURL,并安装了Git和Hudson。 Hudson每分钟都会调查Git来查找更改,如果找到它们,它会创建一个构建版本。我使用这个版本作为我的测试服务器。这很好。

我想在我的中央远程存储库上设置一个post-receive hook,它运行Hudson的force build函数。

我在我的中央Git存储库的hooks目录中创建了一个名为“post-receive”的post-receive文件,该文件是从开发人员的本地分支推送到的。他们每个都推送到中央存储库中的自己的分支。我想在每次推送后立即运行post-receive构建,而不是每分钟都有Hudson轮询Git。

当我打开远程服务器的shell并在hooks文件夹中运行“post-receive”时,它会运行。当人们从本地存储库副本推送到中央存储库时,它就不会被调用。

也许我没有解释这一点,但这就是我理解Git的方式。

收到后代码是两行:

#!/bin/sh
curl http://myserver.com:8080/hudson/job/myjobname/build?token=mytoken

同样,当我打开一个shell并运行它时,它可以工作,但是当有人推动它时,没有任何反应,直到一分钟或更短的时间过去,Hudson意识到Git已经改变,然后它就会构建。

我很乐意澄清是否需要。非常感谢任何帮助。

编辑:玩完之后,我觉得也许后续接收没有执行因为refs没有被更新的东西? git文档说

  

在所有引用更新后,它在远程存储库上执行一次。

这是否意味着如果没有更新,它将无法执行?如果是这样,我很确定事情正在更新,因此它不适用。

这是我的流程: 在本地进行编辑。 提交编辑。 从我的HEAD推送到名为'mybranch'的远程分支(不是主分支,已检出) 这就是我希望我的钩子执行的地方。

5 个答案:

答案 0 :(得分:11)

请检查您的文件是否具有可执行权限。否则无法执行。 像rwxr-xr-x这样的东西就足够了。

您可以使用

添加缺失的位
$ chmod +x /path/to/post-receive

答案 1 :(得分:5)

您使用什么传输方法来推送回购?

只有在使用ssh和http的cgi实现等“智能”传输协议时才会执行挂钩。对于其他'哑'传输协议,如ftp,rsync和旧的http实现,挂钩永远不会被执行。我假设git协议会执行钩子,但推翻该协议从未被认为是个好主意。

答案 2 :(得分:3)

所有这些答案都很有用,但事实证明我在PATH变量中需要git的“bin”目录。我只有“cmd”目录。向PATH添加了c:\my_path_to_git\git\bin,它运行正常。我通过反复试验找到了这个答案并查看了apache错误日志。谢谢大家的帮助!

答案 3 :(得分:1)

尝试在post-receive文件中使用完整路径卷曲,因为PATH可能与手动运行脚本时不同。

如果你想看看运行收发后脚本的环境是什么:

#!/bin/sh
export > file

或只是(它会在推进回购后显示env。变量)

#!/bin/sh
export

另外,我不确定如何在Windows上执行shell scrips,所以#!/ path / to / installed / sh而不是#!/ bin / sh可能有帮助

答案 4 :(得分:1)

我认为简单的答案是您需要移动后接收挂钩服务器端而不是客户端的内容