Frage Wie teile ich ein Git-Repository mit mehreren Benutzern auf einem Computer?


Ich habe ein Git-Repository auf einem Staging-Server, an dem mehrere Entwickler teilnehmen können. git-init scheint eine Flagge zu haben, die sehr nah an dem ist, wonach ich suche: --shared, außer dass ich möchte, dass mehrere Leute auch zu diesem Repository ziehen. Das git-cloneist es --shared flag macht etwas ganz anderes.

Was ist die einfachste Möglichkeit, die Berechtigungen eines vorhandenen Repositorys zu ändern?


201
2018-06-17 01:04


Ursprung


Ich verwende "Github für Windows" und wechsle zwischen zwei Github-Accounts: stackoverflow.com/questions/18565876/... - Alisa


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 der New-Wave-Lösung fort, um eine Gruppe von Entwicklern zu schreiben.

Die Standardlösung

Wenn Sie alle Entwickler in eine speziell erstellte Gruppe stellen, können Sie im Prinzip Folgendes tun:

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

Dann ändere die umask für die Benutzer zu 002, damit neue Dateien mit Berechtigungen erstellt werden, die für Gruppen geschrieben werden können.

Die Probleme damit sind Legion; wenn Sie sich auf einer Distribution befinden, die a annimmt umask von 022 (wie eine gemeinsame haben users Gruppe, die standardmäßig alle enthält), dies kann Sicherheitsprobleme an anderer Stelle öffnen. Und früher oder später wird etwas Ihr sorgfältig gestaltetes Berechtigungsschema vermasseln und das Repo außer Betrieb setzen, bis Sie es bekommen root greifen Sie darauf zu und reparieren Sie es (d. h. führen Sie die obigen Befehle erneut aus).

Die New-Wave-Lösung

Eine überlegene Lösung - obwohl weniger gut verstanden, und die ein bisschen mehr Betriebssystem / Tool-Unterstützung erfordert - ist die Verwendung erweiterter POSIX-Attribute. Ich bin erst vor kurzem in diese Gegend gekommen, daher ist mein Wissen hier nicht so heiß wie es sein könnte. Eine erweiterte ACL bietet jedoch die Möglichkeit, Berechtigungen für mehr als nur die drei Standard-Slots (Benutzer / Gruppe / Andere) festzulegen.

Also noch einmal, erstellen Sie Ihre Gruppe, dann führen Sie:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

Dies richtet die erweiterte ACL für die Gruppe so ein, dass die Gruppenmitglieder lesen / schreiben / auf alle Dateien zugreifen können, die bereits dort sind (die erste Zeile); Sagen Sie dann allen vorhandenen Verzeichnissen, dass für neue Dateien die gleiche ACL gelten soll (zweite Zeile).

Hoffnung, die dich auf den Weg bringt.


171
2018-06-17 06:00



git init hat einen Parameter namens --shared, der die Variable core.sharedRepository für Gruppenarbeit einrichtet. Sie können die Variable auch für ein vorhandenes Repository festlegen. Das macht es überflüssig, die Umask manuell zu setzen, da git sie auf einen vernünftigen Wert setzt, bevor sie Dateien manipuliert. - ptman
+1 für erweiterte POSIX-Attribute - Neuigkeiten für mich! - RobM
Als ich es tat chmod -R g+swX, es machte Git sehr unglücklich und es entschied, dass es kein Git Repository mehr war ("Repo scheint kein Git Repository zu sein"). Ich musste alle g-s chmod Dateien. Um das Setgid-Bit einfach auf dem zu setzen Verzeichnisse, Versuchen find /path/to/repo -type d -print0 | xargs -0 chmod g+s. Mach immer noch das chgrp -R thegroup /path/to/repo. - rescdsk
chmod -R g+swX gitrepo wendet das setguid-Bit auf Dateien an, was ein Sicherheitsrisiko darstellt. Stattdessen können Sie verwenden find . -type d -exec chmod g+s {} + um es nur auf Verzeichnisse anzuwenden. - Ian Dunn
ACL (setfacl) hat keine Einstellung für setgid, um neue Dateien und Unterverzeichnisse zu erzwingen, die in einem Verzeichnis erstellt wurden, um die Gruppen-ID zu erben. Daher müssen Sie Setgid separat über chmod festlegen. Git's --shared Option (git-scm.com/docs/git-init) erlaubt es Ihnen jedoch, die Umask des Benutzers zu setzen und zu überschreiben. - Chase T.


wenn Sie das Repository erstellt haben (oder ein neues blankes Repository aus einem vorhandenen Repository geklont haben) mit

$ git init --shared=group 

oder

$ git init --shared=0NNN

Git soll mit Berechtigungen umgehen, die über die Standardummaske hinausgehen. Letztendlich 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- / Schreibaufwand benötigte, würde ich mit Gitosis gehen. Ich habe auch Erwähnung von Gitolit erwähnt (http://github.com/sitaramc/gitolite), eine Gitosis-Gabel, die für die Erteilung von Berechtigungen auf Branchenebene zuständig ist, kann nicht sagen, dass ich sie jemals persönlich benutzt habe.


113
2018-02-17 05:40



Das ist definitiv die richtige Antwort. - ELLIOTTCABLE
Ich hatte dieses Problem und das ist bei weitem die beste Antwort. Das einzige Problem ist, dass die --shared Argument nimmt eine Oktal, nicht hexadezimal. Ich habe dies in der Quelle von Git 1.7.8 bestätigt und das zweite Beispiel sollte sein git init --shared=0NNN. - qpingu
Was ist NNN-Permissions Maske oder eine Gruppennummer oder etwas anderes? - Craig McQueen
Übrigens, "Gruppe" oben ist ein Schlüsselwort, kein Platzhalter für Ihren Gruppennamen. Sie weisen die Gruppe mit dem Befehl chgrp zu. Für ein neues Repo ist es git init --bare --shared=group myproj wo myproj ist dein Reponame, gefolgt von chgrp -R mygroup myproj wo meine Gruppe ist Ihr Gruppenname. - labradort
Wenn deine Benutzer Commits machen, wenn ihre Standardgruppe anders ist, als sie sein sollte, kann es Dinge vermasseln. Um dieses Problem zu beheben, müssen Sie jeden Benutzer dazu bringen, jede Datei, die im Repo vorhanden ist, in die richtige Gruppe zu übernehmen. Dies wird wiederkehren, wenn Sie nicht herausfinden, wie Sie alle neuen Dateien unter / zur richtigen Gruppe erstellen / wechseln lassen, bevor Sie etwas tun und schieben. - ragerdl


Das wurde nicht gesagt, also möchte ich es schnell hinzufügen.

Um sicherzustellen, dass Probleme mit Berechtigungen nicht ihren hässlichen Kopf verlieren, stellen Sie Folgendes in der Konfigurationsdatei des git shared repository ein:

[core]
    sharedRepository = true

Dadurch wird sichergestellt, dass die Umask-Einstellungen Ihres Systems berücksichtigt werden.


50
2018-03-09 05:52



Laut git-config (1) (kernel.org/pub/software/scm/git/docs/git-config.html) core.sharedRepository, müssen Sie dies auf "umask" oder "false" setzen, damit Git die Umask des Benutzers respektiert. - David Schmitt
Dies und die Antwort von user35117 ist korrekt. Beachten Sie, dass "true" dasselbe ist wie "group", und dies kann mit dem Befehl festgelegt werden git config core.sharedRepository true. - ColinM
Ändert es immer noch die Eigentümerschaft einer Datei, wenn sie an Remote gesendet wird? - Duc Tran
Wenn Sie dies beim Klonen statt nach der Tatsache einrichten möchten, entspricht das Äquivalent von git init --shared ist git clone --config core.sharedRepository=true. Seltsames von git zu benutzen --shared für so unterschiedliche Bedeutungen in solchen ähnlichen Befehlen. - stevek_mcc


Das Git Benutzerhandbuch beschreibt, wie teilen Sie ein Repository In vielen Wegen.

Kompliziertere, aber funktionsreiche Möglichkeiten zur gemeinsamen Nutzung von Repositories sind:

Wir verwenden GitHub für ein Team von 6 Entwicklern.


21
2018-06-17 07:35



Ich mag Gitosis. Es ist eine ziemlich effektive Möglichkeit, den Zugriff basierend auf öffentlichen Schlüsseln zu steuern. - Mike Mazur
Wie löst eine dieser Lösungen das Problem "Ich möchte, dass mehrere Personen an dieses Repository gelangen"? - womble♦
Schau dir Gitosis an. dieser löst dein Problem. - pilif
Wenn Sie das Repository freigeben, können die Benutzer daran ziehen. Sie müssen es wahrscheinlich klonen oder einen Remote-Zweig hinzufügen. Die Dokumentation, die ich verlinkt habe, wird Ihnen sehr gut dabei helfen, Ihr Problem zu lösen. Ich habe alle beschriebenen Methoden verwendet, um Entwicklern bei der Zusammenarbeit mit Git zu helfen. Nach meinem Wissen ist ServerFault nicht für die Handhaltung. - jtimberman
Ich muss der Verwendung von Gitosis zustimmen. Sie umgehen das Problem mit Berechtigungen, indem Sie ein einzelnes Konto verwenden, das mit mehreren SSH-Schlüsseln authentifiziert wurde. Es wird auch komplett über git commits verwaltet. - Jeremy Bouse


Sieh dir auch an Gitolit um dein Git-Repository zu hosten. Gitosis wird anscheinend nicht mehr entwickelt.


9
2018-01-19 08:55





Eine Möglichkeit, Berechtigungen im gemeinsam genutzten Repository zu reparieren, damit Benutzer beim Push-Vorgang keine Berechtigungsprobleme haben, besteht darin, ein Post-Update-Hook-Skript zu erstellen, das genau dies ermöglicht. Dies sollte in jeder Git-Version funktionieren.

Angenommen, Sie haben ein gemeinsames Repository in /myrepo.git. Alle Dateien in diesem Repository gehören zu sagen Meine Sharedgroup. Alle Benutzer, die zu diesem Repository drängen, sollten dazu gehören Meine Sharedgroup ebenfalls. Erstellen Sie nun die folgende Datei (Ändern Meine Sharedgroup zu Ihren Vorlieben):

/myrepo.git/hooks/post-update

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null

4
2017-09-27 14:35



Die richtige Antwort für Benutzer mit unterschiedlichen Standardgruppen - Pat
Durch das Setzen des Setgid-Bits in einem Verzeichnis werden Dateien, die von Benutzern erstellt werden, dieselbe Gruppenbesitzberechtigung wie das Verzeichnis erben (wenn die Benutzer dieser Gruppe angehören). Auch wenn es sich nicht um die Standardgruppe der Benutzer handelt. Dann wird dieser Haken nicht benötigt. Das ist die Antwort von @womble (und mein Kommentar dazu). - rescdsk
Auf meiner centos7-Maschine war, nachdem ich alle auf dieser Seite aufgelisteten Lösungen ausprobiert hatte, eine Variante der oben genannten @ bkmks-Lösung die einzige Option, die tatsächlich funktionierte (Einstellung der Post-Merge und Post-Checkout-Hooks statt Post-Update wie oben). - Mike Godin


Um die guten Ratschläge aus den verschiedenen Antworten und Kommentaren zum Einrichten eines neuen Repos zusammenzufassen:

Wenn Sie ein brandneues Repo einrichten myrepo im /srv/git für die Gruppe mygroup, das ist, was du willst:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. In der ersten Zeile wird das Repo-Verzeichnis erstellt
  2. die zweite Zeile setzt ihre Gruppe auf mygroup
  3. Die dritte Zeile initialisiert ein leeres Repo mit der folgenden Konfiguration:
    1. core.bare = true: Mach es zu einem bloßen Repo
    2. core.sharedrepository = 1 (gleich wie core.sharedrepository = group): Das Repo-Verzeichnis und alle später darin erstellten Verzeichnisse werden von git verwaltet, um zu erlauben mygroup Lese-, Schreib- und Ausführungsberechtigungen (mit dem sgid-Bit auch gesetzt - um mit Benutzern für wen zu arbeiten mygroup ist nicht ihre primäre Gruppe)
    3. receive.denyNonFastforwards = 1: Verweigern Sie Nicht-Fast-Forward-Pushs an den Repo

Verwenden Sie, wenn Sie die Berechtigungen des Benutzers, der Gruppe oder anderer Benutzer optimieren möchten --shared=0NNN, woher NNN sind die Standardbenutzer-, Gruppen- und andere Bits für Dateien (die Bits execute und sgid on Verzeichnisse wird von git entsprechend verwaltet). Dies ermöglicht zum Beispiel Lese- und Schreibzugriff auf den Benutzer und schreibgeschützten Zugriff auf die Gruppe (und keinen Zugriff auf andere):

git init --bare --shared=0640 /srv/git/myrepo.git

Dies ermöglicht Lese- und Schreibzugriff auf den Benutzer und die Gruppe (und keinen Zugriff auf andere):

git init --bare --shared=0660 /srv/git/myrepo.git

Dies ermöglicht Lese- und Schreibzugriff auf den Benutzer und die Gruppe sowie schreibgeschützten Zugriff auf andere:

git init --bare --shared=0664 /srv/git/myrepo.git

Beachten Sie, dass, wenn Sie keinen Schreibzugriff auf die Gruppe zulassen möchten, stellen Sie sicher, dass Sie sie zuerst verwenden chown Setzen Sie den Besitzer des Repos und führen Sie dann den git init Befehl als dieser Benutzer (um sicherzustellen, dass der Repo mit dem richtigen Besitzer für alle anfänglichen Dateien und Unterverzeichnisse initialisiert wird).


3
2018-05-26 01:24



Korrekter als die höheren Stimmenantworten. - XO01


Sie können git-daemon verwenden, um das Repository freizugeben. Lesen Sie die Dokumentation für Git-Daemonfür mehr Informationen.

BEARBEITEN:

Überprüfen Sie auch diesen Artikel 8 Möglichkeiten, dein Git-Repository zu teilen.


2
2018-06-17 02:58