8

我的设置是一个 Windows XAMPP 服务器,启用了 cURL,并安装了 Git 和 Hudson。Hudson 每分钟轮询一次 Git 以查找更改,如果找到更改,它会创建一个构建。我使用这个构建作为我的测试服务器。这工作正常。

我想在我的中央远程存储库上设置一个接收后挂钩,该存储库运行 Hudson 的强制构建功能。

我在我的中央 Git 存储库的 hooks 目录中创建了一个名为“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 被改变了,然后它构建了。

如果需要,我很乐意澄清。任何帮助是极大的赞赏。

编辑:玩弄它之后,我觉得也许 post-receive 没有执行,因为 refs 没有被更新?git文档说

在所有 refs 都更新后,它会在远程存储库上执行一次。

这是否意味着如果没有更新,它将不会执行?如果是这样,我很确定无论如何事情都会更新,所以它不应该适用。

这是我的过程:在本地进行编辑。提交编辑。从我的 HEAD 推送到名为“mybranch”的远程分支(不是已签出的主分支)这是我希望我的钩子执行的点。

4

5 回答 5

11

请检查您的文件是否具有可执行权限。否则无法执行。类似的东西rwxr-xr-x应该足够了。

您可以添加缺少的位

$ chmod +x /path/to/post-receive
于 2011-02-09T21:52:12.157 回答
6

您使用什么传输方式推送到 repo?

只有在使用“智能”传输协议(如 ssh 和 http 的 cgi 实现)时才会执行挂钩。对于其他“哑”传输协议,如 ftp、rsync 和较旧的 http 实现,永远不会执行挂钩。我假设 git 协议会执行钩子,但推送该协议从来都不是一个好主意。

于 2011-02-10T03:25:12.833 回答
3

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

于 2011-02-17T00:08:27.637 回答
1

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

如果你想看看运行 post-receive 脚本的环境是什么:

#!/bin/sh
export > file

或者只是(它会在推入 repo 后显示环境变量)

#!/bin/sh
export

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

于 2011-02-09T22:01:48.513 回答
1

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

于 2016-10-13T14:33:39.073 回答