【问题标题】:How do I execute a post-receive hook on msysgit on Windows hosted by Apache?如何在 Apache 托管的 Windows 上的 msysgit 上执行接收后挂钩?
【发布时间】:2012-11-08 20:18:40
【问题描述】:

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

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

我对这一切的细节有点模糊,但是当 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 帐户可以完全控制存储库。 push 工作正常,但 post-receive 挂钩不执行。

【问题讨论】:

  • 您应该将 shebang 保留为 #!/bin/sh:它会起作用。这是在 msysgit bash 会话中执行的。
  • 谢谢。在问题中查看我的更新。
  • 我已经编辑了我的答案以包括您的错误消息的可能解决方案
  • 奇怪。它可能与可执行位有关(Windows 不支持,如stackoverflow.com/questions/9414942/…

标签: msysgit


【解决方案1】:

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 中):它与 repos 前面的 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 中

【讨论】:

  • 只要 \bin 在 PATH 中,我就可以将 Apache 作为本地系统运行。
  • @KennethXu 是的,但它不会起作用,因为本地系统没有与您的常规帐户相同的环境变量。
  • @VonC,本地系统确实可以访问环境变量,您只需要重新启动:support.microsoft.com/kb/821761
  • @dazweeja 我同意本地系统确实可以访问环境变量,但它肯定不能访问 user 环境变量吗?至少不是与肯尼斯相同的用户?并且可以在那里定义一些重要的变量。
  • @VonC:几个月后我又回到了这个话题。你的第三点是我的问题。我的 Git 在 \cmd 中,并且在我的路径上,所以我认为这已经足够了。完全按照您的指示进行操作。
猜你喜欢
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 2018-07-11
  • 2015-03-04
  • 2012-01-24
  • 2017-10-03
  • 1970-01-01
  • 2020-12-19
相关资源
最近更新 更多