Git智能HTTP协议在推送时无法执行服务器端挂钩



我正在尝试使用githttp后端设置智能HTTP。我试着在网上查阅了大量关于如何做到这一点的文档/指南。我在Windows7上运行Apache 2.4。在我的httpd.conf中,我有

SetEnv GIT_PROJECT_ROOT c:/repos
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ "c:/program files/git/mingw64/libexec/git-core/git-http-backend.exe/"
<LocationMatch "^/git/.*/git.*$">
Require all granted
</LocationMatch>
<Directory "c:/program files/git/mingw64/libexec/git-core/">
<Files "git-http-backend.exe">
Require all granted
</Files>
</Directory>

对于C:repos,我确保Everyone具有完全访问权限。我在我的用户帐户下运行httpd.exe,所以对服务器的请求在PATH上应该可以看到git2.12.2。

C:repos中,我有一个名为foo.git的裸回购。在那个仓库里,我做git config http.receivepack true。我能够很好地克隆http://localhost/git/foo.git.在没有启用服务器端挂钩的情况下,我可以很好地推送提交。

现在,令人讨厌的部分——我创建了一个更新挂钩,它只是C:reposfoo.githooksupdate,包含以下内容:

#!/bin/bash
echo foo
exit 0

我试着从本地回购中推送并获得

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 315 bytes | 315.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://localhost/git/foo.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'http://localhost/git/foo.git'

好的,所以我试着用git协议做同样的事情——我运行git daemon --reuseaddr --base-path=C:repos C:repos。然后我在foo.git里面放了一个git-daemon-export-ok。我回到本地回购并推送至git:///foo.git:

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 315 bytes | 35.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: foo
To git:///foo.git
3b33593..6af841c  master -> master

一切顺利。我使用文件协议file:///c/repos/foo.git进行推送,这也可以正常工作。

我试着做

<Directory c:/>
Require all granted
</Directory>

在我的httpd.conf中,以确保它与访问问题无关。我当然把它换回了Require all denied

基于冗长的推送,gitreceive-pack似乎无法在服务器端启动bash解释器,但我不知道为什么。同样,它是从我的用户帐户下运行的httpd.exe生成的,我可以手动执行git。同样,git也可以在PATH中找到。我缺少什么明显的解决方案?

问题出现在我的httpd.conf文件中。此外,我必须做

SetEnv PATH "C:\Program Files\Git\bin;C:\Program Files\Git\usr\bin;${PATH}"
PassEnv USERNAME

首先,SetEnv是必要的,b.c.没有调用解释器。在我的一个钩子中,我有一条#!/usr/bin/env bash的shebang线,因此添加了C:Program FilesGitusrbin。在另一个钩子中,我可能有#!/bin/bash,所以C:Program FilesGitbin是必要的。

其次,PassEnv USERNAME的原因是其中一个钩子使用了httpd在将环境传递给CGI脚本时排除的环境变量。这里的Apache文档中谈到了这一点

相关内容

  • 没有找到相关文章

最新更新