git apache2 git-http-backend

Configurando Git Server en Windows con git-http-backend.exe



apache2 (1)

OK, así que el infierno se ha congelado y finalmente he conseguido que esto funcione

Creo que había dos cosas que estaban fundamentalmente equivocadas con mi configuración.

1) El usuario no estaba pasando la autenticación, encontré que esto ayudó:

SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER

En segundo lugar, no pude hacer funcionar el "Directorio" físico.

<Directory "C:/GIT/Apache/repositories"> Options +ExecCGI AuthType Basic AuthName intranet AuthUserFile "C:/GIT/Apache/config/users" Require valid-user </Directory>

Para resolver esto utilicé locationMatch tanto para tirar como para empujar. Esto significa que tienes que autenticar para tirar y empujar. Si querías tirar molesto, puedes eliminar la sección "git-upload-pack".

Espero que esto pueda ayudar a alguien más.

Aquí está mi archivo httpd.conf final:

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>

Estoy en el proceso de configurar un servidor Git (1.7.2.3) en una máquina WS 2008 usando Apache y git-http-backend.exe. He estado siguiendo una buena tut here . Tengo la GUI funcionando, puedo clonar de forma molesta y si pongo lo siguiente en la configuración de un repositorio, puedo empujar de manera molesta:

[http] receivepack = true

He añadido lo siguiente al archivo 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>

Cuando agrego el "LocationMatch" todavía puedo clonar de forma molesta o especificando un nombre en la URL, git clone http: //[email protected]

Se le pedirá una contraseña y clonar.

pero cuando intento volver al repositorio, obtengo lo siguiente:

error: no se puede acceder a la URL http://[email protected]/newtestrepo.git/ , el código de retorno 22 es fatal: git-http-push falló

He estado buscando en la página del manual http-backend.exe para obtener ejemplos, pero no puedo hacer que funcionen.

Aquí está el archivo de mis grupos, (esto es solo una prueba de ejemplos, así que nada de lo que se usaría en prod):

admin: jon steve admin webview: jon steve web repogeneral: jon steve testrepo: jon admin testrepo2: jon steve web

Aquí está el archivo de usuarios:

jon:$apr1$kEKVExYx$guIF9oYV8buGhFLZr16XN0 steve:$apr1$jvgjF9nv$PvWsHH.cSOBN5ymk6NT1B0 admin:$apr1$vzXgDskN$oszCei3tkHNUgtLj2HkHF/ web:$apr1$wS0do7hb$VA9tsc9c9LwY5PcjfhdwK0

Sé que el nombre de usuario jon funciona como si hubiera puesto el requisito de directorio en la sección de interfaz de usuario. Puedo iniciar sesión con el nombre de usuario jon no hay problema (apunta al mismo usuario y grupo de archivos que el locationmatch).

No estoy seguro de qué configuración me he perdido en este momento (suponiendo que sea un problema de configuración).

Cualquier consejo para superar este último obstáculo sería fantástico.

EDITAR

He estado jugando un poco más y aquí está la información que tengo:

Si clono un repo con:

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

Puedo sacar el repositorio, pero cuando intento retroceder con:

git push master master

Me piden mi contraseña, la ingreso, luego la vuelve a solicitar y aparece el siguiente error:

C: / temp / remotetest / remotetest> git push origin master Contraseña: Contraseña: error: No puedo acceder a la URL http://[email protected]/remotetest.git/ , código de retorno 22 fatal: git-http-push falló

En mi apache access.log obtengo lo siguiente:

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

Curiosamente, cuando clono con el nombre de usuario en la URL, no importa la contraseña que ingrese, seguirá funcionando. Supongo que esto es porque debería poder tirar anónimamente. No estoy seguro de por qué solicita una contraseña en absoluto en ese momento.

También veo esto en el error de registros:

[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

Editar 2

Intenté recrear el archivo de contraseña haciendo:

htpasswd -c -m C:/git/apacheconfig/users jon

Pero esto no ayudó.

EDITAR 3

la configuración de PHP en httpd.conf donde usa el mismo archivo de usuarios para la autenticación básica:

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

EDITAR 4

Está bien, así que puedo comenzar a clonar y empujar en modo molesto felizmente, pero la autenticación falla para el empuje.

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

Cambié el httpd.conf para usar lo siguiente:

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

Curiosamente, cuando creé un nuevo repositorio (git init --bare newrepo.git) no creó un archivo info / refs. Tuve que hacer el comando "git update-server-info" para crear eso.

Los registros de acceso de Apache tienen algo interesante que podría ser una pista:

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

Fue cuando intenté "empujar" de nuevo al repositorio, pero son comandos GET y no POST. No estoy seguro de lo que es el PROPFIND, aún no se ha encontrado mucha información al respecto. Creo que (leyendo alrededor), podría haber algún tipo de reescritura, que es cambiar el POST a un GET y matarlo, o algo así. Estoy fuera de mi profundidad en este punto sin embargo.

Gracias