Ich habe ein Git-Repository auf einem Staging-Server, auf den mehrere Entwickler zugreifen können müssen. git-init
scheint eine Flagge zu haben, die sehr nahe an dem ist, wonach ich suche:, --shared
außer dass ich möchte, dass auch mehrere Personen in dieses Repository ziehen. Die git-clone
‚s --shared
Flagge tut etwas ganz anderes.
Was ist der einfachste Weg, um die Berechtigungen eines vorhandenen Repositorys zu ändern?
permissions
git
users
share
Andrey Fedorov
quelle
quelle
Antworten:
Berechtigungen sind eine Plage.
Grundsätzlich müssen Sie sicherstellen, dass alle diese Entwickler auf alles im Git-Repo schreiben können.
Fahren Sie mit The New-Wave Solution fort, um zu erfahren, wie Sie einer Gruppe von Entwicklern überlegene Schreibrechte erteilen können.
Die Standardlösung
Wenn Sie alle Entwickler in einer speziell erstellten Gruppe zusammenfassen, können Sie im Prinzip einfach Folgendes tun:
Ändern Sie dann die
umask
für die Benutzer in002
, damit neue Dateien mit gruppenbeschreibbaren Berechtigungen erstellt werden.Die Probleme damit sind Legion; Wenn Sie sich in einer Distribution befinden, die eine
umask
von022
(z. B. eine gemeinsameusers
Gruppe mit standardmäßig allen Benutzern) annimmt , kann dies zu Sicherheitsproblemen an anderer Stelle führen. Und früher oder später wird etwas Ihr sorgfältig ausgearbeitetes Berechtigungsschema durcheinander bringen und das Repo außer Betrieb setzen, bis Sieroot
Zugriff erhalten und es reparieren (dh die obigen Befehle erneut ausführen).Die New-Wave-Lösung
Eine überlegene Lösung, die zwar weniger bekannt ist und etwas mehr Unterstützung für Betriebssysteme und Tools erfordert, ist die Verwendung erweiterter POSIX-Attribute. Ich bin erst vor kurzem in dieses Gebiet gekommen, daher ist mein Wissen hier nicht so heiß, wie es sein könnte. Grundsätzlich ist eine erweiterte ACL jedoch die Möglichkeit, Berechtigungen für mehr als nur die drei Standardsteckplätze (Benutzer / Gruppe / Andere) festzulegen.
Erstellen Sie also noch einmal Ihre Gruppe und führen Sie dann Folgendes aus:
Dies richtet die erweiterte ACL für die Gruppe ein, so dass die Gruppenmitglieder lesen / schreiben / auf alle Dateien zugreifen können, die bereits vorhanden sind (die erste Zeile). Teilen Sie anschließend allen vorhandenen Verzeichnissen mit, dass auf neue Dateien dieselbe ACL angewendet werden soll (zweite Zeile).
Hoffe das bringt dich auf den Weg.
quelle
chmod -R g+swX
, machte es Git sehr unglücklich und entschied, dass es kein Git-Repository mehr war ("repo scheint kein Git-Repository zu sein"). Ich musste alle Dateien ändern . Versuchen Sie, nur das Setgid-Bit in den Verzeichnissen zu setzenfind /path/to/repo -type d -print0 | xargs -0 chmod g+s
. Mach immer noch daschgrp -R thegroup /path/to/repo
.chmod -R g+swX gitrepo
Wendet das Setguid-Bit auf Dateien an, was ein Sicherheitsrisiko darstellt. Stattdessen können Siefind . -type d -exec chmod g+s {} +
es nur auf Verzeichnisse anwenden.wenn Sie das Repository erstellt haben (oder ein neues Bare-Repository von einem vorhandenen geklont haben) mit
oder
Git soll Berechtigungen verarbeiten, die über das hinausgehen, was Ihre Standard-Umask bietet. Endlich trifft dies auf meine Version von Git (1.6.3) zu. Dies setzt natürlich voraus, dass sich Ihre Benutzer in derselben Gruppe befinden.
Wenn ich jedoch die Verwaltung von Benutzern in mehreren Gruppen mit unterschiedlichem Lese- / Schreibgrad benötigte, würde ich mich für Gitosis entscheiden. Ich habe auch die Erwähnung von Gitolite ( http://github.com/sitaramc/gitolite ) gehört, einer Gitosisgabel, von der angenommen wird, dass sie Berechtigungen auf Zweigebene bietet. Ich kann jedoch nicht sagen, dass ich sie von jedem persönlich verwendet habe.
quelle
--shared
Argument ein Oktal und kein Hexadezimal enthält. Ich habe dies in der Quelle von Git 1.7.8 bestätigt und das zweite Beispiel sollte es seingit init --shared=0NNN
.NNN
Berechtigungsmaske oder eine Gruppennummer oder etwas anderes?git init --bare --shared=group myproj
myproj für Ihren Repo-Namen, gefolgt vonchgrp -R mygroup myproj
mygroup für Ihren Gruppennamen.Dies wurde nicht gesagt, deshalb möchte ich es schnell hinzufügen.
Stellen Sie in der Konfigurationsdatei Ihres git shared repositorys Folgendes sicher, um sicherzustellen, dass Berechtigungsprobleme nicht zu einem unerwünschten Ergebnis führen:
Dadurch wird sichergestellt, dass die "umask" -Einstellungen Ihres Systems eingehalten werden.
quelle
git config core.sharedRepository true
.git init --shared
lautet das Äquivalent vongit clone --config core.sharedRepository=true
. Seltsamerweise--shared
für so unterschiedliche Bedeutungen in so ähnlichen Befehlen zu verwenden.Das Git-Benutzerhandbuch beschreibt auf verschiedene Arten, wie Sie ein Repository freigeben.
Kompliziertere, aber funktionsreiche Möglichkeiten zum Freigeben von Repositorys sind:
Wir verwenden GitHub für ein Team von 6 Entwicklern.
quelle
Schauen Sie sich auch gitolite an, um Ihr Git-Repository zu hosten . Gitosis wird anscheinend nicht mehr entwickelt.
quelle
Eine Möglichkeit, Berechtigungen im freigegebenen Repository zu reparieren, damit Benutzer beim Pushen keine Berechtigungsprobleme haben, besteht darin, ein Hook-Skript nach dem Update zu erstellen, das genau das tut. Dies sollte in jeder Git-Version funktionieren.
Angenommen, Sie haben ein freigegebenes Repository in /myrepo.git. Alle Dateien in diesem Repository gehören zu mysharedgroup . Alle Benutzer, die in dieses Repository pushen , sollten ebenfalls zu mysharedgroup gehören . Erstellen Sie nun die folgende Datei (ändern Sie mysharedgroup nach Ihren Wünschen ):
/myrepo.git/hooks/post-update
quelle
/dev/null
. Bitte lassen Sie den Benutzer diese Nachrichten zuerst sehen und entscheiden Sie dann selbst.So fassen Sie die wichtigsten Ratschläge aus den verschiedenen anderen Antworten und Kommentaren zum Einrichten eines neuen Repos zusammen:
Wenn Sie eine brandneue Repo - Einrichtung sind
myrepo
in/srv/git
der Gruppemygroup
, ist es das , was Sie wollen:mygroup
core.bare = true
: machen Sie es zu einem nackten Repocore.sharedrepository = 1
(dasselbe wiecore.sharedrepository = group
): Das Repo-Verzeichnis und alle später darin erstellten Verzeichnisse werden von git verwaltet, ummygroup
Lese-, Schreib- und Ausführungsberechtigungen zu ermöglichen (wobei auch das Sgid-Bit gesetzt ist), um mit Benutzern zu arbeiten, für diemygroup
es nicht das richtige ist Hauptgruppe)receive.denyNonFastforwards = 1
: Nicht-Schnellvorlauf-Pushs an das Repo verweigernWenn Sie die Berechtigungen von Benutzern, Gruppen oder anderen Benutzern optimieren möchten, geben Sie an
--shared=0NNN
, woNNN
sich die Standardbenutzer-, Gruppen- und anderen Bits für Dateien befinden (die Ausführungs- und sgid-Bits für Verzeichnisse werden von git entsprechend verwaltet). Dies ermöglicht beispielsweise Lese- und Schreibzugriff auf den Benutzer und schreibgeschützten Zugriff auf die Gruppe (und keinen Zugriff auf andere):Dies ermöglicht Lese- und Schreibzugriff auf den Benutzer und die Gruppe (und keinen Zugriff auf andere):
Dies ermöglicht den Lese- und Schreibzugriff auf den Benutzer und die Gruppe sowie den schreibgeschützten Zugriff auf andere:
Beachten Sie, dass Sie, wenn Sie keinen Schreibzugriff auf die Gruppe zulassen möchten, zuerst
chown
den Eigentümer des Repos festlegen und dann dengit init
Befehl als dieser Benutzer ausführen müssen (um sicherzustellen, dass das Repo mit dem richtigen Eigentümer für initialisiert wird alle Ausgangsdateien und Unterverzeichnisse).quelle
Sie können git-daemon verwenden, um das Repository freizugeben. Weitere Informationen finden Sie in der Dokumentation zu git-daemon .
BEARBEITEN:
Lesen Sie in diesem Artikel auch 8 Möglichkeiten, Ihr Git-Repository freizugeben .
quelle
Genau das hat bei mir funktioniert, bei einem vorhandenen Repository. Dies lässt sich aus mehreren Antworten und Kommentaren ableiten:
Aus Ihrem übergeordneten Repository-Verzeichnis auf dem Server:
quelle
@stevek_mcc Antwort ist die, nach der ich gesucht habe, als ich nach dieser Frage gegoogelt habe
quelle