4

我正在 Windows 主机上设置 Git 服务器。我已经安装了最新的 Apache,并让它与 msysGit 一起工作。我根本没有使用 SSH;我可以通过 HTTP 推送和拉取。

现在我想添加一个接收后挂钩来通知我的构建服务器,但我不知道该怎么做。我在服务器的存储库中看到了示例挂钩脚本,但我对在那里做什么感到困惑。我是放一个 Windows 批处理文件,命名为post-receive.bat,还是做其他事情?

我对这一切在做什么的细节有点模糊,但是当 Apache 看到 Git URL 时,它正在执行 c:\Program Files\git\libexec\git-core\git-http-backend.exe。git-http-backend.exe 会触发 post-receive 钩子吗?

更新 我越来越近了。这是我的钩子,hooks/post-receive在我的回购中:

#!/c/Program Files/Git/bin/sh
curl http://mybuildserver:8080/job/Whazzup/build

我改变了shebang,#!/bin/sh因为在Windows上我没有。现在在 Apache 错误日志中,我收到了消息error: cannot spawn hooks/post-receive: No such file or directory

顺便说一句,Git bashchmod似乎不起作用。post-receive但是我能够rwxr-xr-x通过重命名示例文件来获得权限。

更新 我将 shebang 行改回#!/bin/sh,但我仍然在 Apache 错误日志中得到相同的错误error: cannot spawn hooks/post-receive: No such file or directory:作为测试,我在 hooks 文件夹中打开了一个 Git bash 提示符,并使用 执行了该钩子./post-receive,并且它起作用了。

更新 现在我想知道我是否有其他问题。听从 VonC 的建议,我尝试在我自己的帐户下从命令行运行 Apache httpd,而不是作为 LocalSystem 下的服务。还是一样的。推拉工作正常,但钩子不执行。然后我试着让 Apache 脱离这个等式。在与 repo 相同的计算机上,我从 Git bash 提示符进行了克隆(通过文件系统)、修改、提交和推送。但是钩子仍然没有执行。

更新 好的,我的钩子脚本中有一个愚蠢的问题,但现在至少当我从同一台计算机(通过文件系统)推送到 repo 时它会执行。但不是当我推动 Apache 时。Apache 现在在一个普通帐户下运行,并且 Apache 帐户可以完全控制存储库。推送工作正常,但 post-receive 挂钩不执行。

4

1 回答 1

3

Apachec:\Program Files\git\libexec\git-core\git-http-backend.exe在看到 Git URL 时正在执行。git-http-backend.exe会触发 post-receive 钩子吗?

不,它会将命令 ( clone, push, pull) 传递给git它自己。
post-receive钩子将在推送完成后执行,它是一个bash (unix shell) 脚本,如“ Windows 上的 post-receive hook - GIT_WORK_DIR: no such file or directory ”所示。

另请参阅“ git windows post pull ”以查看可以在哪里创建该post-receive脚本(在.git/hooks您的存储库中):它与存储库前面的 http Apache 服务无关。


关于错误信息“cannot spawn hooks/post-receive: No such file or directory”,可以参考“ msysgit error with hooks:”git error: cannot spawn .git/hooks/post-commit: No such file or directory “ ”:

  • shebang 必须是#!/bin/sh
  • Apache 必须作为普通用户而不是本地系统运行,以便从为所述普通用户定义的环境变量中受益。
  • <path_to_git>\bin必须在PATH
于 2012-11-09T18:17:57.783 回答