So konfigurieren Sie ein vorhandenes Git-Repo für die Freigabe durch eine UNIX-Gruppe

98

Ich habe ein vorhandenes Git-Repo (ein nacktes), das bis jetzt nur von mir geschrieben werden konnte. Ich möchte es für eine UNIX-Benutzergruppe öffnen, foo, damit alle Mitglieder von foo darauf zugreifen können. Mir ist bewusst, dass ich problemlos ein neues Git-Repo einrichten kann mit:

git init --bare --shared=group repodir
chgrp -R foo repodir

Aber ich brauche die entsprechende Operation für ein vorhandenes Repo-Verzeichnis.

Pistos
quelle
4
Auf ServerFault (einer anderen StackOverflow-Site) gibt es eine hervorragende Antwort auf diese Frage .
Zearin

Antworten:

113

Versuchen Sie Folgendes, damit ein vorhandenes Repository repodirfür Benutzer in Gruppen funktioniert foo:

chgrp -R foo repodir                 # set the group
chmod -R g+rw repodir                # allow the group to read/write
chmod g+s `find repodir -type d`     # new files get group id of directory
git init --bare --shared=all repodir # sets some important variables in repodir/config ("core.sharedRepository=2" and "receive.denyNonFastforwards=true")
David Underhill
quelle
14
Ich würde hinzufügen, dass Sie wahrscheinlich auch config.sharedRepository = true in der Konfiguration des Repos setzen sollten. kernel.org/pub/software/scm/git/docs/git-config.html
Pistos
1
Dies kommt dem, was ich alleine gemacht habe, ziemlich nahe, aber ich wollte eine externe Bestätigung erhalten. Vielen Dank. :) Ich hatte auch gehofft, dass es einen Git-Klon geben würde --shared = Gruppensache, aber die --shared-Option des Klons macht etwas völlig anderes.
Pistos
5
Sie können den git init --sharedBefehl für ein vorhandenes Repo verwenden, um den Konfigurationswert festzulegen. Sie müssen auch den chmodBefehl ausführen, um die Berechtigungen der Dateien richtig zu erhalten.
Spencer
1
Dies zu bestätigen hilft auch, wenn Sie in einem Chaos sind, weil jemand ein git pulletc. als root gemacht hat und nicht als www-dataoder was auch immer der Besitzer ist und als Ergebnis erhalten Sie error: insufficient permission for adding an object to repository database .git/objects. Ich dachte, ich hätte den Besitz aller Dateien / Verzeichnisse, die mit findund -type d/ falsch waren, behoben type -f, aber nur diese Methode hat den Fehler beseitigt (wahrscheinlich, weil eine Datei in einem Unterverzeichnis nicht für Gruppen beschreibbar war?)
William Turrell
1
Die Umask des Benutzers scheint immer noch auf neu erstellte Dateien zuzutreffen. Erwarten Sie das? Ich würde denken, dass die Dokumentation von core.sharedRepositorydies erwähnen würde - es scheint nutzlos, ohne dass Benutzer alle ihre Dateigruppen beschreibbar machen.
Sam Brightman
47

Führen Sie im Repo-Verzeichnis folgende Befehle aus:

git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir

Bearbeiten: Um häufige Verwirrung zu vermeiden, groupist ein aktuelles Schlüsselwort, das Sie nicht durch den Namen der Gruppe ersetzen sollten.

kixorz
quelle
25
Wo groupist NICHT der Name der Gruppe :)
Pierre de LESPINAY
7
Objekt- und Packdateien sollten unveränderlich sein. Sie sollten die Berechtigungen 444 / r - r - r-- haben.
CB Bailey
3
Nachdem ich versucht habe, git config core.sharedRepository devdann zu git configfatal: bad config value for 'core.sharedrepository' in .git/configgit version 1.7.0.4
tippen, steige
3
git config core.sharedRepository group groupist nicht der Name der Gruppe, sondern der tatsächliche Wert!
Kixorz
Wenn Sie den Fehler gemacht haben, Ihren Gruppennamen anstelle von "Gruppe" zu verwenden, öffnen Sie einfach .git / config im Texteditor und bearbeiten Sie die Zeile core.sharedRepository mit "Gruppe".
Tom
41

Durch das Zusammenführen der Antworten von @David Underhill und @kixorz habe ich meine eigene (endgültige) Lösung gefunden.

Es ist für nackte Repos und nicht nackte Repos. Es gibt nur geringe Unterschiede zwischen ihnen, aber auf diese Weise wird klarer.

BARE REPOSITORY

cd <repo.git>/                            # Enter inside the git repo
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w objects/pack/*                  # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

wo:

  • <repo.git>ist das nackte Repository-Verzeichnis, normalerweise auf dem Server (z my_project.git/. B. ).
  • <group-name>ist der Gruppenname für Git-Benutzer (z . B. Benutzer ).

NICHT BARE REPOSITORY

cd <project_dir>/                         # Enter inside the project directory
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w .git/objects/pack/*             # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

wo:

  • <project_dir>ist das Projektverzeichnis, das den .gitOrdner enthält.
  • <group-name>ist der Gruppenname für Git-Benutzer (z . B. Benutzer ).
Andrea
quelle
Wie Charles sagte, tun Sie auch: chmod g-w objects/pack/*(wenn nicht nacktes Repository, voranstellen .git/)
Wernight
Wie finden wir hier den Gruppennamen oder wie erstellen wir den Gruppennamen?
Sujithrao
'chmod g + s find . -type d' löst Fehler ausunable to execute /bin/chmod: Argument list too long
Dr.X
Wie @ Dr.X bemerkt, skaliert chmod g+s `find . -type d`nicht. Verwenden Siefind -type d -exec chmod g+s {} +
Hagello
Ich denke, alle losen Objekte sollten auch schreibgeschützt sein, basierend auf dem Status vor der Freigabe. Vielleicht so etwas wie chmod g-w objects/*/*. Ich bin mir jedoch nicht sicher über das Info-Unterverzeichnis, da es für dieses Repo leer ist.
Eric
3

Dies ist wahrscheinlich nicht erforderlich, aber es ist erwähnenswert, dass git init --bare --sharedauch die Option verweigernNonFastForwards festgelegt ist .

git config receive.denyNonFastForwards true

Diese Option hat folgende Bedeutung:

receive.denyNonFastForwards

Wenn Sie Commits, die Sie bereits gepusht haben, neu starten und dann erneut pushen oder auf andere Weise versuchen, ein Commit an einen Remote-Zweig zu senden, der nicht das Commit enthält, auf das der Remote-Zweig derzeit verweist, werden Sie abgelehnt. Dies ist im Allgemeinen eine gute Politik; Im Fall der Rebase können Sie jedoch feststellen, dass Sie wissen, was Sie tun, und die Remote-Verzweigung mit einem -f-Flag für Ihren Push-Befehl erzwingen.

(von http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration )

Nerfologe
quelle
1

Zusätzlich zu den obigen Antworten zum Zulassen des Lesens / Schreibens einer Gruppe müssen Sie den Benutzer zur Gruppe hinzufügen (sagen Sie "foo").

sudo usermod -a -G [groupname] [username]

Hinweis: Sie müssen zuerst einen Benutzer erstellen, wenn dieser nicht vorhanden ist

sarvagya kumar
quelle