Протокол 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 здесь