如何在Apache托管的Windows上的msysgit上执行post-receive挂钩?

时间:2012-11-08 20:18:40

标签: msysgit

我正在Windows主机上设置Git服务器。我安装了最新的Apache,并使用msysGit。我根本不使用SSH;我可以推送和通过HTTP。

现在我想添加一个post-receive挂钩来通知我的构建服务器,但我无法弄清楚如何做到这一点。我在服务器上的存储库中看到了示例钩子脚本,但我对在那里做什么感到困惑。我是否将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

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

顺便说一下,Git bash的chmod似乎不起作用。但我可以通过重命名示例文件获得post-receiverwxr-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帐户可以完全控制存储库。推送工作正常,但后接收挂钩不会执行。

1 个答案:

答案 0 :(得分:3)

  

Apache在看到Git URL时正在执行c:\Program Files\git\libexec\git-core\git-http-backend.exegit-http-backend.exe是否会触发post-receive挂钩?

不,它会将命令(clonepushpull)传递给git本身。
推送完成后将执行post-receive hook,它是 bash (unix shell)脚本,如“post-receive hook on Windows - GIT_WORK_DIR: no such file or directory”中所示。

另请参阅“git windows post pull”以了解您可以在哪里创建post-receive脚本(位于您的repo的.git/hooks中):它与前面的http Apache服务无关回购。


关于错误消息“无法生成挂钩/接收后:没有此类文件或目录”,您可以参考“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