Configurazione di Git Server su Windows con git-http-backend.exe

Sono in procinto di configurare un server Git (1.7.2.3) su un computer WS 2008 utilizzando Apache e git-http-backend.exe. Ho seguito un buon tut qui . Ho la GUI in funzione, posso clonare fastidiosamente e se metto il seguente nella configurazione di un repository posso infastidirlo:

[http] receivepack = true 

Ho aggiunto quanto segue al file 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"  Allow from all   AuthType Basic AuthName "Git Access" AuthUserFile C:/GIT/ApacheConfig/users AuthGroupFile C:/GIT/ApacheConfig/groups Require group repogeneral  

Quando aggiungo il “LocationMatch” posso ancora clonare infedelemente o specificando un nome nell’URL, git clone http: //[email protected]

Richiederà una password e un clone.

ma quando provo a tornare al repository ottengo il seguente:

errore: imansible accedere all’URL http: //[email protected]/newtestrepo.git/ , codice di ritorno 22 fatale: git-http-push fallito

Ho cercato la pagina man http-backend.exe per gli esempi ma non riesco a farli funzionare.

ecco il mio file di gruppo, (questo è solo testando esempi, quindi niente che verrebbe utilizzato in prod):

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

ecco il file degli utenti:

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

So che il nome utente jon funziona come se inserissi il requisito di directory nella sezione gui. Posso accedere con il nome utente jon senza problemi, (punta allo stesso utente e ai file di gruppo come fa il locationmatch).

Non sono sicuro di quale configurazione mi sia sfuggita a questo punto (assumendo che si tratti di un problema di configurazione).

Qualche consiglio su come superare questo ultimo ostacolo sarebbe fantastico.

MODIFICARE

Ho giocato un po ‘di più ed ecco le informazioni che ho:

se clonato un repository con:

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

Posso ottenere il repository, ma quando provo a respingere con:

git push origin master

Ho chiesto la mia password, la inserisco, poi la domanda di nuovo, poi ho il seguente errore:

C: \ temp \ remotetest \ remotetest> genitore origine push git Password: Password: errore: imansible accedere all’URL http: //[email protected]/remotetest.git/ , codice restituito 22 fatale: git-http-push fallito

Nel mio access.log Apache ottengo il seguente:

 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 

È interessante notare che quando clone con il nome utente nell’URL non importa quale password inserisco, funzionerà comunque. Suppongo che ciò sia dovuto al fatto che dovrei essere in grado di estrarre in modo anonimo. Non sono sicuro del motivo per cui chiede una password a quel punto.

Vedo anche questo errore nei registri:

 [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 

MODIFICA 2

Ho provato a ricreare il file password facendo:

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

ma questo non ha aiutato.

MODIFICA 3

la configurazione di PHP in httpd.conf dove usa lo stesso file utente per l’autenticazione di base:

  AuthName "GitUsers" AuthType Basic AuthUserFile C:/GIT/ApacheConfig/users AuthGroupFile C:/GIT/ApacheConfig/groups require group webview  

MODIFICA 4

OK, quindi posso arrivare alla clonazione e spingere felicemente in modalità noiosa, ma l’autenticazione fallisce per la spinta.

 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 

Ho cambiato httpd.conf per usare quanto segue:

  SetEnv GIT_PROJECT_ROOT "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories" SetEnv GIT_HTTP_EXPORT_ALL  Options Indexes FollowSymLinks MultiViews Includes ExecCGI AllowOverride None Order allow,deny Allow from all   AuthType Basic AuthName "Git Access" AuthUserFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/repositories/.htpasswd" Require valid-user  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  

È interessante notare che quando ho creato un nuovo repository (git init –bare newrepo.git) non ha creato un file info / refs. Ho dovuto eseguire il comando “git update-server-info” per crearlo.

I log di Apache Access hanno qualcosa di interessante che potrebbe essere un indizio:

 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 

Questo è quando stavo cercando di “spingere” indietro al repository, ma sono comandi GET e nessun POST. non sono sicuro di cosa sia il PROPFIND, non ho ancora trovato molte informazioni su questo. Penso che (leggendo intorno), potrebbe esserci una sorta di riscrittura in corso, che sta cambiando il POST in un GET e uccidendolo, o qualcosa del genere. Sono fuori dalla mia profondità, a questo punto però.

Grazie

OK, quindi l’inferno si è congelato e finalmente ho funzionato!

Credo che ci fossero due cose che erano fondamentalmente sbagliate nel mio setup.

1) L’utente non ha ottenuto l’autenticazione passata, ho trovato che questo ha aiutato:

 SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER 

In secondo luogo, non riuscivo a far funzionare la “Directory” fisica.

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

Per risolvere questo problema ho usato locationMatch sia per il pull che per il push. Ciò significa che devi autenticarti per tirare e spingere. Se volessi infastidire il tiro, puoi rimuovere la sezione “git-upload-pack”.

Spero che questo possa aiutare qualcun altro.

Ecco il mio file httpd.conf finale:

 DocumentRoot "C:/GIT/Apache/www"  Options +ExecCGI Allow from all   Allow from all   AuthType Basic AuthName intranet AuthUserFile "C:/GIT/Apache/config/users" require valid-user  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"  Options +ExecCGI AuthType Basic AuthName intranet AuthUserFile "C:/GIT/Apache/config/users" Require valid-user   Options +ExecCGI AuthType Basic AuthName intranet AuthUserFile "C:/GIT/Apache/config/users" Require valid-user