2009-11-02 11 views
39

Ich habe einige Git-Repositories per Fernzugriff über SSH und ich möchte einige von ihnen schreibgeschützt machen, um mehr Pushs zu verhindern. Manche Leute haben Fernbedienungen, die auf diese Repositories zeigen.Wie mache ich ein Git-Repository schreibgeschützt?

Diese leeren Repositories wurden initialisiert --shared=group, also Dateirechte für alle Dateien auf 660 zu setzen, die gut genug sind, um SSH-Zugriff zu erlauben, aber Schreibzugriffe zu verbieten? Oder gibt es einen leichteren Weg?

Prost.

Antwort

39

Es gibt mehr als eine Möglichkeit, dies zu tun.

  • Wenn die Benutzer jeweils ein Shell-Account haben (vielleicht begrenzt), und jeder von ihnen git Repositories über ihr eigenes Konto zuzugreifen, können Sie -Dateisystem Berechtigungen zu steuern SSH-Zugriff auf Git-Repositories verwenden. Unter Unix wären das Schreibrechte auf Verzeichnisse, vielleicht mit Hilfe des Erstellens einer Gruppe und bestimmter Berechtigungen für eine Gruppe (mit gesetztem "Sticky Group ID").

  • Pushing erfordert git-receive-pack in $ PATH des Benutzers zu sein, und für sie ausführbar sein ... obwohl ich nicht sicher bin, wie möglich dieser Ansatz wäre.

  • Sie können update oder pre-receive Haken zu tun Zugangskontrolle zu Repository, beispielsweise mit update-paranoid Beispiel Haken aus contrib/hooks in git Quellen verwenden.

  • Bei größerer Anzahl von Benutzern können Sie besser mit einem Tool Zugriff auf Git-Repositories, wie Gitosis zu verwalten (in Python, erfordert Setuptools) oder Gitolite (in Perl).

  • Für Sie kann nur Zugriff lesen Setup git daemon read-only bieten anonyme (und nicht authentifizierte) Zugriff über git:// Protokoll, statt den Zugriff über SSH-Protokoll.

    Siehe Dokumentation für url.<base>.insteadOf Konfigurationsvariable für eine Möglichkeit, den Übergang vom SSH zum GIT-Protokoll zu erleichtern.


Siehe auch Kapitel 4. "Git on the Server" von Pro Git Buch von Scott Chacon (CC-BY-NC-SA-Lizenz).

+2

Beachten Sie, dass Sie für Dateisystemberechtigungen chmod verwenden können, wie von Pat Notz vorgeschlagen. –

+8

Danke für die Ideen (alle). Inspiriert durch den update-paranoiden Beispiel-Hook, habe ich nun einen Haken in meinen Repos, der einfach für alle Pushs "echo" Closed "; exit 1' –

+1

@SteveFolly Wenn Ihr Kommentar eine Antwort wäre, würde ich dafür stimmen statt der angenommenen Antwort. Dein ist kurz, auf den Punkt und arbeitet. –

3

Da git in erster Linie auf das Dateisystem für die Zugriffskontrolle beruht, wird das funktionieren. Beachten Sie, dass die Welt in Ihren Berechtigungen keinen Zugriff auf die Datei hat, der Benutzer und die Gruppe jedoch Lese-/Schreibzugriff haben. Wenn Sie von der Welt lesbar sind, sollten Ihre Berechtigungen 0444 sein.

Sie könnten weitere Feinabstimmungen vornehmen, indem Sie die Repo-Berechtigungen als 0664 setzen, wobei der Benutzer nobody ist und die Gruppe etwa gitdevs ist. Nur Personen in der Gruppe gitdevs können dann in den Repo schreiben, aber die Welt kann daraus lesen.

Follow-upHere is a link, die verschiedenen Möglichkeiten, deckt Ihre Repo- und Abdeckungen kommen & Nachteile Pro zu teilen und Zugangskontrollfunktionen.

+0

666 ist weltweit lesbare und beschreibbare Dateien. 776 ist welt- und gruppenlesbar, schreibbar und ausführbar und andere Benutzer lesen und schreiben. Nicht sicher, wo Sie die von Ihnen empfohlenen Nummern erhalten haben, aber sie sind im Allgemeinen gefährlich. – Dustin

+0

Danke, korrigiert meine Antwort. Zu viel tippen, nicht genug denken. – jheddings

0

Eine andere Möglichkeit ist das Git-Protokoll, aber es muss der Git-Daemon ausgeführt werden.

1

Wenn Sie auch eine Zugangskontrolle benötigen, lesen Sie gitosis. Ziemlich einfach einzurichten und Sie können mit einem einfachen Skript steuern, wer was tun kann.

+1

Oder gitolite: http://github.com/sitaramc/gitolite –

9
chmod -R a-w /path/to/repo.git 
+0

"machen Sie einige von ihnen schreibgeschützt, um mehr Stöße zu verhindern" - das würde das Ziehen verhindern, nicht wahr? – user3175580

7

Ein Hook, der einfach eine informative Nachricht druckt und mit einem Nicht-Null-Status endet, erledigt den Job.

Angenommen, Sie einige aussagekräftige Informationen stellen in Ihrer Nachricht, schneidet sie auch auf die Anfragen von frustrierte Benutzer fragen nach unten, warum sie nicht drücken können:

#!/bin/bash 
echo "==================================================" 
echo "This repository is no longer available for pushes." 
echo "Please visit blah blah yadda yadda ...." 
echo "==================================================" 
exit 1 
0

Vor kurzem habe ich Zugriff auf Pfadbegrenzung „/ repo. git/git-receive-pack ", um zu erreichen, dass das Repository für einige Benutzer schreibgeschützt und für einige andere schreibgeschützt ist. In httpd-Konfiguration sieht es so aus:

<Location /repo.git/> 
      Require group developers developers-ro 
    </Location> 

    <Location /repo.git/git-receive-pack> 
      Require group developers 
    </Location>