1

我正在尝试使用 git-http-backend 设置智能 HTTP。我试图在网上遵循大量关于如何做到这一点的文档/指南。我在 Windows 7 上运行 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,我确保每个人都具有完全访问权限。我在我的用户帐户下运行 httpd.exe,因此向服务器发出的请求应该在 PATH 上看到 git 2.12.2 就好了。

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

现在烦人的部分——我创建了一个更新钩子,C:\repos\foo.git\hooks\update它包含以下内容:

#!/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. 然后我放了一个git-daemon-export-ok里面foo.git。我回到本地仓库并推送到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了当然。

基于详细的推送,似乎 git-receive-pack 无法在服务器端启动 bash 解释器,但我不知道为什么。同样,它是从在我的用户帐户下运行的 httpd.exe 产生的,我可以手动执行 git。再一次,可以在 PATH 上找到 git 就好了。我在这里缺少什么样的明显解决方案?

4

1 回答 1

0

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

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

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

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

于 2017-10-20T00:25:49.677 回答