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.
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")
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.
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).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 )
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