Протокол Git Smart HTTP не в состоянии выполнять серверные хуки при нажатии

Я пытаюсь настроить интеллектуальный HTTP с помощью git-http-backend. Я пытался следить за большим количеством документации / руководств в Интернете о том, как это сделать. Я использую Apache 2.4 на Windows 7. В моем 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 под своей учетной записью, поэтому запросы к серверу должны нормально видеть git 2.12.2 в PATH.

В 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 просто отлично. Какое очевидное решение мне здесь не хватает?

1 ответ

Решение

Проблема была в моем файле httpd.conf. Кроме того, я должен был сделать

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

Во-первых, SetEnv было необходимо, потому что переводчик не вызывался. В одном из моих крючков у меня есть линия Шебанга #!/usr/bin/env bashТаким образом, добавление C:\Program Files\Git\usr\bin, В другом крючке я мог бы иметь #!/bin/bash, так C:\Program Files\Git\bin будет необходимо.

Во-вторых, причина PassEnv USERNAME потому что одна из ловушек использовала ту переменную окружения, которую httpd исключает при передаче окружения в сценарий CGI. Об этом говорится в документации Apache здесь

Другие вопросы по тегам