Подтвердить что ты не робот

Настройка Git Сервер в Windows с помощью git -http-backend.exe

Я запускаю сервер Git (1.7.2.3) на машине WS 2008 с использованием Apache и git -http-backend.exe. Я слежу за хорошим tut здесь. У меня работает графический интерфейс, я могу досадно клонировать, и если я вложу следующее в конфигурацию репо, я могу досадно нажать:

[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://[email protected]

Он будет запрашивать пароль и клонировать.

но когда я пытаюсь вернуться к репо, я получаю следующее:

Ошибка: не удается получить доступ к URL http://[email protected]/newtestrepo.git/, код возврата 22  фатальный: git -http-push failed

Я смотрел на http-backend.exe man page, но не могу заставить их работать.

вот мой файл групп (это просто тестирование примеров, поэтому ничего не будет использовано в 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 работает так, как если бы я поместил требование к каталогу в раздел gui, я могу войти с именем пользователя jon без проблем (указывает на то же имя пользователя и файлы группы, что и locationmatch).

Я не уверен, какую конфигурацию я упустил на этом этапе (при условии, что проблема с конфигурацией).

Любые советы по преодолению этого последнего препятствия были бы фантастическими.

ИЗМЕНИТЬ

Я играл еще немного, и вот информация у меня есть:

если я клонирую репо с помощью:

git clone http://[email protected]/remotetest.git

Я могу получить репозиторий, но когда я попытаюсь вернуться с помощью:

git нажмите начальный мастер

Меня спрашивают мой пароль, я ввожу его, затем он снова запрашивает его, затем я получаю следующую ошибку:

C:\temp\remotetest\remotetest > git нажмите начало оригинала Пароль: Пароль: Ошибка: не удается получить доступ к URL http://[email protected]/remotetest.git/, код возврата 22 фатальный: git -http-push failed

В моем 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, где он использует один и тот же файл пользователей для базового auth:

<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>

EDIT 4

ОК, поэтому я могу добираться до клонирования и счастливо продвигаться в беззаботном режиме, но аутентификация не работает для нажатия.

C:\temp\test2\temp\test>git push origin master
Password:
Password:
error: Cannot access URL http://[email protected]: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 ", чтобы создать это.

В журналах Access Apache есть что-то интересное, что может быть ключом:

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 и убивает ее или что-то в этом роде. Тем не менее, я нахожусь в моей глубине.

Спасибо

4b9b3361

Ответ 1

ОК, так что ад замерз, и я наконец получил эту работу!

Я считаю, что в моей настройке были две вещи, которые были принципиально неправильными.

1) Пользователь не прошел аутентификацию, я нашел, что это помогло:

SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER

Во-вторых, я не мог заставить физический "Directory" работать.

<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>