Git提交后钩子不起作用

8
我的设置是一个Windows XAMPP服务器,启用了cURL,并安装了Git和Hudson。 Hudson每分钟轮询Git以查找更改,如果发现更改,则创建一个构建。我将此构建用作我的测试服务器。这很好地工作。
我想在我的中央远程存储库上设置一个post-receive钩子,以运行Hudson的force build函数。
我在我的中央Git存储库的hooks目录中创建了一个名为“post-receive”的post-receive文件,该文件从开发人员的本地分支推送到其中。他们每个人都会将其推送到中央存储库上的自己的分支上。我希望在每次推送后立即运行post-receive构建,而不是让Hudson每分钟轮询Git。
当我打开一个shell到远程服务器并在hooks文件夹中运行“post-receive”时,它运行。只是当人们将其本地存储库副本推送到中央存储库时,它没有被调用。
也许我没有解释清楚,但这就是我理解Git的方式。 post-receive代码只有两行:
#!/bin/sh
curl http://myserver.com:8080/hudson/job/myjobname/build?token=mytoken

再次说明,当我打开shell并运行它时,它可以工作,但当有人向它推送内容时,什么也不会发生,直到一分钟或更短的时间过去,Hudson才意识到Git已经更改,然后进行构建。

如果需要澄清,我很乐意提供帮助。非常感谢您的任何帮助。

编辑:在尝试了一下之后,我觉得可能是因为没有更新引用,所以post-receive没有执行?Git文档说:

它在所有引用都被更新后在远程存储库上执行。

这是否意味着如果没有更新,它就不会执行?如果是这样,我相信事情仍在更新,所以它不应该适用。

我的过程如下:

本地进行编辑。

提交编辑内容。

从我的HEAD推送到名为“mybranch”的远程分支(而不是检出的主分支)。

这是我想要执行钩子的时刻。


你的git守护进程正在运行的用户是否有执行该脚本的权限? - jweyrich
不确定。当我通过Git Bash运行它时,它可以执行,但是当我推送到它时就不行了。我该如何检查这些权限? - spanky
正确的权限取决于您共享存储库的方式和实际配置。但是,msquared向您说明了如何将可执行权限授予所有用户/组,因此如果问题确实是这样,它应该可以解决。 - jweyrich
该文件是可执行的,只是在我进行git-push时没有被执行或者没有被正确执行。还有其他的想法吗? - spanky
在您的post-receive钩子中放置一个echo语句以查看它是否实际运行,例如:"echo hook ran!" -- git将把它发送给调用者。 - ebneter
5个回答

11
请检查您的文件是否具有可执行权限,否则无法执行。 类似于rwxr-xr-x这样的权限应该足够了。
您可以使用以下命令添加缺少的权限:
$ chmod +x /path/to/post-receive

已经完成了。现在是rwxr-xr-x,记住它是通过Git Bash shell执行的,但仍然无法通过push自行执行。 - spanky

6
你使用什么传输方式推送到版本库?
只有在使用“智能”传输协议(如ssh和http的cgi实现)时,钩子才会被执行。对于其他“愚蠢”的传输协议,如ftp、rsync和旧版http实现,钩子将永远不会被执行。我认为git协议会执行钩子,但是通过该协议推送从未被视为一个好主意。

哦,天啊。我正在使用http。失败了。有没有关于切换到另一个版本的建议,而不会破坏我当前在repo中拥有的任何东西?我也会自己查看。 - spanky
如果您使用http://www.kernel.org/pub/software/scm/git/docs/git-http-backend.html,仍然可以使用HTTP,但我不知道如何在Windows上设置它。您还可以使用本机Windows服务器或cygwin设置SSH服务器,但我也没有任何经验。正如您已经发现的那样,Windows并不是托管git存储库的最友好的操作系统。 - Arrowmaster
@Arrowmaster,你的评论对我设置HTTP玩具存储库非常有用,我还需要执行钩子。谢谢! - user59634
@Arrowmaster - 我该如何检查我正在使用哪种传输方法? - Dariux
如果在Git扩展中看到以git@bitbucket.org开头的远程存储库URL,则意味着它是SSH传输方法,对吗?那么它无法启动的其他原因是什么? - Dariux

3

所有这些答案都很有用,但事实证明我需要将git的"bin"目录添加到我的PATH变量中。我只添加了"cmd"目录。将c:\my_path_to_git\git\bin添加到PATH中,它就可以正常工作了。我通过试错和查看Apache错误日志找到了这个答案。感谢大家的帮助!


1

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

如果您想查看运行post-receive脚本的环境:

#!/bin/sh
export > file

或者只是(推送到仓库后它将显示环境变量)

#!/bin/sh
export

另外,我不确定在Windows上如何执行shell脚本,因此使用#!/path/to/installed/sh而不是#!/bin/sh可能会有所帮助。


不确定curl的完整路径是什么。我在这里完全迷失了。“sh”路径是否应该是与Git一起提供的sh?Windows很令人困惑。当我运行出口时,一切都很好,当我手动运行post-receive脚本时,但当我推送时脚本根本没有运行,所以那对我没有什么帮助。 CURL路径会很有帮助。我的PATH中有c:\ xampp \ php,我还需要什么? - spanky
你需要找出curl安装的位置,并在脚本中使用完整路径来调用curl。手动运行shell(git的shell)并输入"which curl" -- 它会打印类似于/usr/bin/curl的内容。将脚本中的"curl"替换为它所打印的内容。 - ebneter

1
我认为简单的答案是,您需要将 post-receive 钩子的内容从客户端移动到服务器端。

2
欢迎来到 Stack Overflow!这实际上是一条评论,而不是答案。当您的声望更高时,您将能够发布评论 - Mat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接