2010-09-28 14 views
20

Estoy en el proceso de configurar un servidor de Git (1.7.2.3) en una máquina WS 2008 usando Apache y git-http-backend.exe. He estado siguiendo un buen tut here. Tengo el trabajo GUI, puedo annoymously clon y si pongo el siguiente en la configuración de un acuerdo de recompra me puedo empujar annoymously:Configuración de Git Server en Windows con git-http-backend.exe

[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 annoymously o especificando un nombre en la URL, git clone http://[email protected]

se le pedirá una contraseña y clon.

pero cuando intento de hacer retroceder al repositorio consigo el siguiente:

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

he estado buscando en el http-backend.exe man page para obtener ejemplos, pero no puede hacer que funcionen.

aquí es mi archivo de grupos, (esto es sólo probando ejemplos así que nada que serían utilizadas en prod):

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

aquí es el archivo de los 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 puse el requisito de directorio en la sección de GUI puedo iniciar sesión con el nombre de usuario JON no hay problema, (apunta a los mismos archivos de usuario y grupo que lo hace la coincidencia de ubicación).

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

Cualquier consejo sobre cómo 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 clonar una cesión temporal con:

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

puedo conseguir el repositorio a cabo, pero cuando intento y retrocedo con:

git push origen maestro

me preguntan por mi contraseña, entro en él, entonces le pide de nuevo, entonces me sale el siguiente error:

C: \ temp \ RemoteTest \ RemoteTest> git push origin master Contraseña: contraseña : de error: no se puede acceder a la URL http://[email protected]/remotetest.git/, código 22 volver fatal: git-http-push no

En mi acceso de Apache.ingrese consigo el 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 clon con el nombre de usuario en la URL que no importa lo que la contraseña que puse en, todavía trabajar. Estoy asumiendo que esto se debe a que debería poder tirar de forma anónima. No estoy seguro de por qué pide una contraseña en ese momento.

también veo esto en el error de los 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 

EDIT 2

He intentado recrear el archivo de contraseñas haciendo:

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

pero esto no ayuda .

EDITAR 3

la configuración de PHP en httpd.conf donde se utiliza el mismo archivo de usuarios de 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

OK para que pueda obtener clonar y empujar en modo anómalo 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 

he cambiado el httpd.conf para utilizar el 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 he creado una nueva operación (git init --bare newrepo.git) No creó una información/refs archivo. 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 

Eso es cuando yo estaba tratando de "empuje" de vuelta al repositorio, pero son los comandos de obtención y ningún puesto. no estoy seguro de qué es PROPFIND, todavía no se ha encontrado mucha información sobre eso. Creo que, (leyendo), podría haber algún tipo de reescritura, que es cambiar el POST a un GET y matarlo, o algo así. Sin embargo, estoy fuera de mi profundidad en este momento.

Gracias

+0

No estoy seguro de por qué "' htdocs'" entra en la imagen en términos de' Directory'definition. – VonC

+0

que es la ubicación predeterminada de Apache para servir archivos. Uso PHP gui para mostrar los repositorios, esto usa el mismo archivo authuser y da el inicio de sesión emergente y funciona con el mismo nombre de usuario y contraseña. usándolo como una prueba para asegurarse de que Apache pueda entender el archivo de contraseñas de los usuarios. – Jon

+0

Esta pregunta debe estar en http://serverfault.com/ ya que se trata menos de programación y más con configuración y configuración, ¿no? –

Respuesta

23

OK, por lo que el infierno se ha congelado y finalmente lo han conseguido este trabajo!

Creo que hubo dos cosas que fueron fundamentalmente erróneas con mi configuración.

1) El usuario no se iba a pasar a través de la autenticación, encontré esto ayudó:

SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER 

En segundo lugar no pude conseguir el "Directorio" física para trabajar.

<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 debe autenticarse para tirar y empujar.Si quería molestar a alguien, puede eliminar la sección "git-upload-pack".

Espero que esto ayude a otra persona.

Aquí está mi archivo httpd.conf definitiva:

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

Comentarios excelentes. Gracias. +1 – VonC

+0

Hola Jon, muy bien tu trabajo. puede ayudarme a entender cómo administró la configuración de los usuarios, ya que parece que esto no fue un problema para usted – pollux1er

+0

@ pollux1er Me mudé a github al final. Solo lo estaba usando para mí, así que no tenía mucha preocupación con los usuarios. No puedo recordar mucho sobre eso ahora, lo siento y GL. – Jon

Cuestiones relacionadas