2012-12-09 4 views
7

Ich möchte Git-Repository über "Smart" HTTP, auf die ich nur schieben kann, aber jemand (oder jemand mit Account) klonen/holen von haben.Wie kann ich anonymen Lesezugriff (Pull), aber authentifizierten Schreibzugriff (Push) auf ein Git-Repository über http aktivieren?

Im git-http-backend(1) Manpage man die folgende Beispielkonfiguration für Apache-Webserver finden:

Stellen Sie sicher, mod_cgi, mod_alias und mod_env aktiviert sind, stellen GIT_PROJECT_ROOT (oder DocumentRoot) entsprechend, und erstellen Sie eine Script auf die CGI:

SetEnv GIT_PROJECT_ROOT /var/www/git 
SetEnv GIT_HTTP_EXPORT_ALL 
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ 

anonymen Lesezugriff zu aktivieren, aber authentifizierten Schreibzugriff, eine Zulassung mit einer Location Richtlinie:

<LocationMatch "^/git/.*/git-receive-pack$"> 
     AuthType Basic 
     AuthName "Git Access" 
     Require group committers 
     #... 
</LocationMatch> 

Leider funktioniert diese Konfiguration nicht. Ich kann Abruf-/Klon-Repository ohne Probleme, ohne authenthication zu erfordern, aber drängen versagt:

$ git push origin master 
error: Cannot access URL http://localhost/git/test.git/, return code 22 
fatal: git-http-push failed 

Prüfungs error.log von Apache Web-Server nicht hilft:

 
[...] Service not enabled: 'receive-pack' 
[...] Request not supported: '/var/www/git/test.git/' 

Die access.log sagt uns, dass git push zuerst verwendet die GET-Methode unter /git/test.git/info/refs?service=git-receive-pack abfragebasierte URL, die nicht von der LocationMatch-Direktive abgedeckt wird:

 
[...] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 403 304 "-" "git/1.7.10.4" 
[...] "GET /git/test.git/info/refs HTTP/1.1" 200 267 "-" "git/1.7.10.4" 
[...] "GET /git/test.git/HEAD HTTP/1.1" 200 337 "-" "git/1.7.10.4" 
[...] "PROPFIND /git/test.git/ HTTP/1.1" 404 250 "-" "git/1.7.10.4" 

(In den folgenden Zeilen geht es um einen "dummen" WebDAV-basierten HTTP-Push - ist es möglich, diesen Fallback zu deaktivieren?).


Vorerst verwende ich die folgende Lösung: I gültige erfordern sowohl für Abruf- und push (unter Verwendung von modifizierten Konfiguration von „Authentifizierung für Lese- und Schreibvorgänge“ example in git-http-backend(1) -Manpage) und Filterung der Push-to-Single-User-via pre-receivehook durch Untersuchung REMOTE_USER Umgebungsvariable.

+0

können Sie schreiben (oder Verwendung) einen Haken, der Anmeldeinformationen (Umgebungsvariablen) und verwerfen unerwünschte Schübe überprüft. Sie können die Dinge auch auf diese Weise einschränken (zB erlauben Sie Pushs auf "devel", aber nur bestimmte Benutzer zu "master") –

+0

@Vi .: Ich weiß, das ist was ich in meiner _ "Fallback" _ Lösung mache. .. aber meine Fallback-Lösung benötigt 'valid-user', also ist es nicht wirklich anonymes Lesen (fetch). –

+0

@ JakubNarębski oh ... meine Lösung benötigt auch 'valid-user', wie aktuell konfiguriert. Sie könnten 'REMOTE_USER' jedoch auf einen Dummy-Wert in Ihrem anonymen Zugriffsbereich setzen. Da 'all VonC

Antwort

1

Eine nicht so komplexe Alternative ist die Verwendung von gitolite zusätzlich zu Ihrem Apache-Git-Setup.
Sie können Gitolite leicht mit Apache verbinden (keine SSH-Konfiguration erforderlich).

Siehe als Beispiel: , kombiniert mit diesem lokalen gitolite installation script.

Sie können dann leicht Apache-Logins für den Schreibzugriff und @all für Lesezugriff deklarieren.

1

Sie haben Ihre Repo .git/config Datei mit dem folgenden Wert zu aktualisieren:

[http] 
    receivepack = true 
+0

Sie können Ihre Antwort verbessern, indem Sie sie besser formatieren. –

Verwandte Themen