Come configurare un repository Git esistente per essere condiviso da un gruppo UNIX


98

Ho un repository git esistente (uno nudo) che fino a questo punto è stato scrivibile solo da me. Voglio aprirlo a qualche gruppo di utenti UNIX, foo, in modo che tutti i membri di foo possano eseguire il push. Sono consapevole che posso facilmente configurare un nuovo repository git con:

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

Ma ho bisogno dell'operazione equivalente per una directory repo esistente .


4
C'è un'ottima risposta a questa domanda su ServerFault (un altro sito StackOverflow).
Zearin

Risposte:


114

Prova questo per fare in modo che un repository esistente repodirfunzioni per gli utenti nel gruppo 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")

14
Vorrei aggiungere che probabilmente dovresti anche impostare config.sharedRepository = true nella configurazione del repository. kernel.org/pub/software/scm/git/docs/git-config.html
Pistos

1
Questo è abbastanza vicino a quello che stavo facendo da solo, ma volevo ottenere una conferma esterna. Grazie. :) Speravo anche che ci sarebbe stato un git clone --shared = group, ma l'opzione --shared di clone fa qualcosa di completamente diverso.
Pistos

5
È possibile utilizzare il git init --sharedcomando su un repository esistente per impostare il valore di configurazione. È inoltre necessario eseguire il chmodcomando per ottenere le autorizzazioni dei file corrette.
Spencer

1
Confermare questo aiuta anche se sei in disordine perché qualcuno ha fatto un git pullecc. Come root piuttosto che come www-datao qualunque sia il proprietario e di conseguenza ottieni error: insufficient permission for adding an object to repository database .git/objects. Pensavo di aver corretto la proprietà di tutti i file / directory che erano sbagliati usando finde -type d/ type -f, ma solo questo metodo ha eliminato l'errore (probabilmente perché un file in qualche sottodirectory non era scrivibile dal gruppo?)
William Turrell

2
L'umask dell'utente sembra ancora applicarsi ai file appena creati. È quello che ti aspetti? Penso che la documentazione di core.sharedRepositorylo menzionerebbe: sembra inutile senza che gli utenti rendano scrivibili tutti i loro gruppi di file.
Sam Brightman

47

Nella directory repo eseguire i seguenti comandi:

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

Modifica: per affrontare la confusione frequente, groupè una parola chiave effettiva, non dovresti sostituirla con il nome del gruppo.


25
Dov'è groupNON il nome del gruppo :)
Pierre de LESPINAY

7
I file oggetto e pacchetto dovrebbero essere immutabili; dovrebbero avere i permessi 444 / r - r - r--.
CB Bailey

3
Dopo aver provato git config core.sharedRepository devquindi digitando git configottengo fatal: bad config value for 'core.sharedrepository' in .git/configa git version 1.7.0.4(e possibilmente le versioni dopo)
Kzqai

3
git config core.sharedRepository group groupnon è il nome del gruppo, ma il valore effettivo!
kixorz

Se hai commesso l'errore di utilizzare il nome del tuo gruppo invece di "gruppo", apri semplicemente .git / config nell'editor di testo e modifica la riga core.sharedRepository per dire "gruppo".
Tom

43

Unendo le risposte di @David Underhill e @kixorz , ho creato la mia soluzione (definitiva).

È per repo nudi e non nudi . Ci sono solo piccole differenze tra loro, ma in questo modo è più chiaro.

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

dove:

  • <repo.git>è la semplice directory del repository, tipicamente sul server (ad esempio my_project.git/).
  • <group-name>è il nome del gruppo per gli utenti git (ad esempio gli utenti ).

REPOSITORY NON NUDO

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

dove:

  • <project_dir>è la directory del progetto che contiene la .gitcartella.
  • <group-name>è il nome del gruppo per gli utenti git (ad esempio gli utenti ).

Come ha detto Charles, fai anche: chmod g-w objects/pack/*(se repository non nudo, .git/
anteponi

qui come possiamo trovare il nome del gruppo o come creare il nome del gruppo?
Sujithrao

"chmod g + s find . -type d" genera un erroreunable to execute /bin/chmod: Argument list too long
Dr.X

Come ha notato @ Dr.X, chmod g+s `find . -type d`non scala. Usafind -type d -exec chmod g+s {} +
hagello

Penso che anche tutti gli oggetti sciolti dovrebbero essere di sola lettura in base allo stato pre-condiviso. Forse qualcosa di simile chmod g-w objects/*/*. Non sono sicuro della sottodirectory info, dato che è vuota per questo repository.
Eric,

3

Questo probabilmente non è necessario, ma vale la pena sottolineare che git init --bare --sharedimposta anche l' opzione denyNonFastForwards .

git config receive.denyNonFastForwards true

Il significato di questa opzione è il seguente:

receive.denyNonFastForwards

Se rebase i commit che hai già inviato e poi provi a eseguire nuovamente il push, o altrimenti provi a inviare un commit a un ramo remoto che non contiene il commit a cui punta attualmente il ramo remoto, ti verrà negato. Questa è generalmente una buona politica; ma nel caso del rebase, potresti determinare di sapere cosa stai facendo e puoi forzare l'aggiornamento del ramo remoto con un flag -f al tuo comando push.

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


1

Oltre alle risposte precedenti per consentire a un gruppo di leggere / scrivere, è necessario aggiungere anche l'utente al gruppo (ad esempio "pippo").

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

Nota: dovrai prima creare l'utente se non esiste

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.