web-dev-qa-db-fra.com

Comment configurer un dépôt git existant à partager par un groupe UNIX

J'ai un dépôt git existant (un nu) qui jusqu'à présent n'a été inscriptible que par moi. Je veux l'ouvrir à un groupe d'utilisateurs UNIX, foo, afin que tous les membres de foo puissent y pousser. Je suis conscient que je peux facilement configurer un nouvea git repo avec:

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

Mais j'ai besoin de l'opération équivalente pour un existant repo dir.

87
Pistos

Essayez ceci pour faire fonctionner un référentiel existant dans repodir pour les utilisateurs du groupe 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")
104
David Underhill

Dans le répertoire repo, exécutez les commandes suivantes:

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

Modifier: pour éviter les confusions fréquentes, group est un mot clé réel, vous n'êtes pas censé le remplacer par le nom du groupe.

44
kixorz

Fusionnant @ David Underhill et @ kixorz réponses, j'ai fait ma propre solution (définitive).

C'est pour les dépôts nus et non-nus . Il n'y a que peu de différences entre eux, mais de cette façon, c'est plus clair.

DÉPOSITAIRE NU

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

où:

  • <repo.git> est le répertoire de référentiel nu, généralement sur le serveur (par exemple my_project.git/).
  • <group-name> est le nom du groupe pour les utilisateurs de git (par exemple utilisateurs).

DÉPOSITAIRE NON NU

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

où:

  • <project_dir> est le répertoire du projet contenant le .git dossier.
  • <group-name> est le nom du groupe pour les utilisateurs de git (par exemple utilisateurs).
39
Andrea

Ce n'est probablement pas nécessaire, mais il convient de souligner que git init --bare --shared définit également l'option denyNonFastForwards .

git config receive.denyNonFastForwards true

La signification de cette option est la suivante:

receive.denyNonFastForwards

Si vous rebasez les validations que vous avez déjà poussées, puis réessayez de pousser, ou sinon essayez de pousser une validation vers une branche distante qui ne contient pas la validation vers laquelle la branche distante pointe actuellement, vous serez refusé. Il s'agit généralement d'une bonne politique; mais dans le cas du rebase, vous pouvez déterminer que vous savez ce que vous faites et pouvez forcer la mise à jour de la branche distante avec un indicateur -f à votre commande Push.

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

3
nerfologist

En plus des réponses ci-dessus d'autoriser un groupe à lire/écrire, vous devez également ajouter l'utilisateur au groupe (dites "foo").

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

Remarque: vous devrez d'abord créer un utilisateur s'il n'existe pas

1
sarvagya kumar