Настройка Git Server в Windows С помощью git-http-backend.exe
Я нахожусь в процессе настройки сервера Git (1.7.2.3) на машине WS 2008, используя Apache и git-http-backend.exe. Я следил за хорошей тутой. У меня работает графический интерфейс, я могу раздраженно клонировать и, если я добавлю следующее в конфигурацию репозитория, я могу раздраженно нажать:
[http]
receivepack = true
Я добавил следующее в файл httpd.conf:
SetEnv GIT_PROJECT_ROOT C:/GIT/Repositories
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAliasMatch \
"(?x)^/(.*/(HEAD | \
info/refs | \
objects/(info/[^/]+ | \
[0-9a-f]{2}/[0-9a-f]{38} | \
pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
git-(upload|receive)-pack))$" \
"C:/Program Files (x86)/git/libexec/git-core/git-http-backend.exe/$1"
<Directory />
Allow from all
</Directory>
<LocationMatch "^/git/.*/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
AuthUserFile C:/GIT/ApacheConfig/users
AuthGroupFile C:/GIT/ApacheConfig/groups
Require group repogeneral
</LocationMatch>
Когда я добавляю "LocationMatch", я все еще могу клонировать раздраженно или указав имя в URL, git clone http://jon@myserver.com/
Он запросит пароль и клон.
но когда я пытаюсь вернуться в репо, я получаю следующее:
ошибка: невозможно получить доступ к URL-адресу http://jon@myserver.com/newtestrepo.git/, код возврата 22 неустраним: сбой git-http-push
Я искал справочную страницу http-backend.exe для примеров, но не могу заставить их работать.
Вот мой файл групп (это просто тестирование примеров, поэтому ничего не будет использовано в prod):
admin: jon steve admin
webview: jon steve web
repogeneral: jon steve
testrepo: jon admin
testrepo2: jon steve web
вот файл пользователя:
jon:$apr1$kEKVExYx$guIF9oYV8buGhFLZr16XN0
steve:$apr1$jvgjF9nv$PvWsHH.cSOBN5ymk6NT1B0
admin:$apr1$vzXgDskN$oszCei3tkHNUgtLj2HkHF/
web:$apr1$wS0do7hb$VA9tsc9c9LwY5PcjfhdwK0
Я знаю, что имя пользователя jon работает так, как будто я наложил требование на каталог в разделе графического интерфейса, и я могу войти в систему с именем пользователя jon без проблем (указывает на те же файлы пользователей и групп, что и для locationmatch).
Я не уверен, какую конфигурацию я пропустил в данный момент (при условии, что это проблема конфигурации).
Любой совет по преодолению этого последнего препятствия был бы фантастическим.
РЕДАКТИРОВАТЬ
Я играл еще немного, и вот информация, которая у меня есть:
если я клонирую репо с:
git clone http://jon@myserver.com/remotetest.git
Я могу вытащить репозиторий, но когда я пытаюсь отодвинуть назад:
мастер происхождения git push
Меня спрашивают о моем пароле, я ввожу его, затем он запрашивает его снова, затем я получаю следующую ошибку:
C: \ temp \ remotetest \ remotetest> мастер отправления git push Пароль: Пароль: ошибка: невозможно получить доступ к URL http://jon@myserver.com/remotetest.git/, код возврата 22 неустраним: сбой git-http-push
В моем Apache access.log я получаю следующее:
192.168.1.2 - - [29/Sep/2010:21:58:19 +0100] "GET /remotetest.git/info/refs?service=git-upload-pack HTTP/1.1" 200 38
192.168.1.2 - - [29/Sep/2010:21:58:51 +0100] "GET /remotetest.git/info/refs?service=git-receive-pack HTTP/1.1" 403 -
192.168.1.2 - - [29/Sep/2010:21:58:51 +0100] "GET /remotetest.git/info/refs HTTP/1.1" 200 -
192.168.1.2 - - [29/Sep/2010:21:58:51 +0100] "GET /remotetest.git/HEAD HTTP/1.1" 200 23
Интересно, что когда я клонирую имя пользователя в URL-адресе, не имеет значения, какой пароль я ввел, он все равно будет работать. Я предполагаю, что это потому, что я должен иметь возможность тянуть анонимно. Не уверен, почему он запрашивает пароль вообще на этом этапе.
Я также вижу это в журнале ошибок:
[Wed Sep 29 22:33:00 2010] [error] [client 192.168.1.2] client denied by server configuration: C:/Program Files (x86)/Git/libexec/git-core/git-http-backend.exe
[Wed Sep 29 22:33:00 2010] [error] [client 192.168.1.2] client denied by server configuration: C:/Program Files (x86)/Git/libexec/git-core/git-http-backend.exe
РЕДАКТИРОВАТЬ 2
Я попытался воссоздать файл паролей, выполнив:
htpasswd -c -m C:/git/apacheconfig/users jon
но это не помогло
РЕДАКТИРОВАТЬ 3
Конфигурация PHP в httpd.conf, где он использует тот же файл пользователей для базовой аутентификации:
<Directory "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs">
AuthName "GitUsers"
AuthType Basic
AuthUserFile C:/GIT/ApacheConfig/users
AuthGroupFile C:/GIT/ApacheConfig/groups
require group webview
</Directory>
РЕДАКТИРОВАТЬ 4
Хорошо, так что я могу с радостью приступить к клонированию и отправке в раздражающем режиме, но аутентификация завершается неудачно.
C:\temp\test2\temp\test>git push origin master
Password:
Password:
error: Cannot access URL http://jon@192.168.10.97:8000/repositories/test.git/, return code 22
fatal: git-http-push failed
Я изменил httpd.conf, чтобы использовать следующее:
<VirtualHost *:80>
SetEnv GIT_PROJECT_ROOT "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories"
SetEnv GIT_HTTP_EXPORT_ALL
<Directory "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories">
Options Indexes FollowSymLinks MultiViews Includes ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<LocationMatch "^/repositories/.*/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
AuthUserFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories/.htpasswd"
Require valid-user
</LocationMatch>
ScriptAliasMatch \
"(?x)^/repositories/(.*/(HEAD | \
info/refs | \
objects/(info/[^/]+ | \
[0-9a-f]{2}/[0-9a-f]{38} | \
pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
git-(upload|receive)-pack))$" \
"C:/Program Files (x86)/Git/libexec/git-core/git-http-backend/$1"
ErrorLog C:/GIT/error_log
CustomLog C:/GIT/access_log combined
</VirtualHost>
Интересно, что когда я создал новый репозиторий (git init --bare newrepo.git), он не создал файл info / refs. Мне пришлось сделать команду "git update-server-info", чтобы создать это.
В журналах Apache Access есть кое-что интересное, что может быть подсказкой:
192.168.10.97 - - [05/Oct/2010:22:48:26 +0100] "GET /repositories/test.git/info/refs?service=git-receive-pack HTTP/1.1" 200 -
192.168.10.97 - - [05/Oct/2010:22:48:26 +0100] "GET /repositories/test.git/HEAD HTTP/1.1" 200 23
192.168.10.97 - - [05/Oct/2010:22:48:28 +0100] "PROPFIND /repositories/test.git/ HTTP/1.1" 405 248
Именно тогда я пытался "подтолкнуть" обратно к репо, но это команды GET, а не POST. не уверен, что такое PROPFIND, пока не нашел много информации об этом. Я думаю, (читая вокруг), может происходить какое-то переписывание, которое заменяет POST на GET и убивает его, или что-то в этом роде. Я нахожусь вне моей глубины в этом пункте все же.
Спасибо
1 ответ
Хорошо, значит, ад замерз, и я наконец-то заработал!
Я считаю, что были две вещи, которые были в корне неверны с моей настройкой.
1) Пользователь не проходил аутентификацию, я обнаружил, что это помогло:
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
Во-вторых, я не мог заставить работать физический "Справочник".
<Directory "C:/GIT/Apache/repositories">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
Require valid-user
</Directory>
Чтобы решить эту проблему, я использовал locationMatch для pull и push. Это означает, что вы должны аутентифицировать, чтобы тянуть и толкать. Если вы хотите раздражать, вы можете удалить раздел "git-upload-pack".
Надеюсь, что это может помочь кому-то еще.
Вот мой последний файл httpd.conf:
DocumentRoot "C:/GIT/Apache/www"
<Directory />
Options +ExecCGI
Allow from all
</Directory>
<Directory "C:/GIT/Apache/www">
Allow from all
</Directory>
<Directory "C:/GIT/Apache/www/secure">
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
require valid-user
</Directory>
SetEnv GIT_PROJECT_ROOT C:/GIT/Apache/repositories
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAliasMatch \
"(?x)^/(.*/(HEAD | \
info/refs | \
objects/(info/[^/]+ | \
[0-9a-f]{2}/[0-9a-f]{38} | \
pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
git-(upload|receive)-pack))$" \
"C:/Program Files/git/libexec/git-core/git-http-backend.exe/$1"
<LocationMatch "^/.*/git-receive-pack$">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
Require valid-user
</LocationMatch>
<LocationMatch "^/.*/git-upload-pack$">
Options +ExecCGI
AuthType Basic
AuthName intranet
AuthUserFile "C:/GIT/Apache/config/users"
Require valid-user
</LocationMatch>