我正在尝试使用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文档中谈到了这一点