我正在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-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帐户可以完全控制存储库。推送工作正常,但后接收挂钩不会执行。
答案 0 :(得分:3)
Apache在看到Git URL时正在执行
c:\Program Files\git\libexec\git-core\git-http-backend.exe
。git-http-backend.exe
是否会触发post-receive挂钩?
不,它会将命令(clone
,push
,pull
)传递给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"”:
#!/bin/sh
<path_to_git>\bin
必须位于PATH