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