Git Smart HTTP协议无法在推送

时间:2017-10-18 21:48:26

标签: git apache http version-control git-http-backend

我尝试使用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,我确保Everyone具有完全访问权限。我在我的用户帐户下运行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。再一次,git可以在PATH上找到就好了。我在这里错过了什么样的明显解决方案?

1 个答案:

答案 0 :(得分:0)

问题出在我的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 Files\Git\usr\bin。在另一个钩子中,我可以#!/bin/bash,因此C:\Program Files\Git\bin是必要的。

其次,PassEnv USERNAME的原因是因为其中一个钩子正在利用httpd在将环境传递给CGI脚本时排除的环境变量。它是在the Apache docs here

中谈到的