J'ai un repo git existant (un simple) qui n'a jusqu'à présent été accessible en écriture 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 nouveau repo git avec:
git init --bare --shared=group repodir
chgrp -R foo repodir
Mais j'ai besoin de l'opération équivalente pour un répertoire de repo existant .
git
permissions
share
shared
Pistos
la source
la source
Réponses:
Essayez ceci pour faire fonctionner un référentiel existant
repodir
pour les utilisateurs du groupefoo
:la source
git init --shared
commande sur un dépôt existant pour définir la valeur de configuration. Vous devez également exécuter lachmod
commande pour obtenir les autorisations des fichiers correctement.git pull
etc. en tant que root plutôt qu'en tant quewww-data
ou quel que soit le propriétaire et par conséquent, vous obtenezerror: insufficient permission for adding an object to repository database .git/objects
. Je pensais avoir corrigé la propriété de tous les fichiers / répertoires erronés en utilisantfind
et-type d
/type -f
, mais seule cette méthode a éliminé l'erreur (probablement parce qu'un fichier dans un sous-répertoire n'était pas inscriptible en groupe?)core.sharedRepository
le mentionnerait - cela semble inutile sans que les utilisateurs ne rendent tous leurs groupes de fichiers inscriptibles.Dans le repo dir, exécutez les commandes suivantes:
Edit: Pour
group
éviter une confusion fréquente, est un mot clé réel, vous n'êtes pas censé le remplacer par le nom du groupe.la source
group
n'est PAS le nom du groupe :)git config core.sharedRepository dev
puis en tapantgit config
je reçoisfatal: bad config value for 'core.sharedrepository' in .git/config
dansgit version
1.7.0.4
(et peut - être après les versions)git config core.sharedRepository group
group
n'est pas le nom du groupe, mais la valeur réelle!En fusionnant les réponses @David Underhill et @kixorz , j'ai créé ma propre solution (définitive).
C'est pour les dépôts nus et les dépôts non nus . Il n'y a que peu de différences entre eux, mais de cette manière, c'est plus clair.
REPOSITAIRE NU
où:
<repo.git>
est le répertoire du référentiel nu, généralement sur le serveur (par exemplemy_project.git/
).<group-name>
est le nom du groupe pour les utilisateurs git (par exemple, les utilisateurs ).REPOSITORY NON NU
où:
<project_dir>
est le répertoire du projet contenant le.git
dossier.<group-name>
est le nom du groupe pour les utilisateurs git (par exemple, les utilisateurs ).la source
chmod g-w objects/pack/*
(si dépôt non nu, préfixez.git/
)find . -type d
' déclenche une erreurunable to execute /bin/chmod: Argument list too long
chmod g+s `find . -type d`
ne s'adapte pas. Utilisationfind -type d -exec chmod g+s {} +
chmod g-w objects/*/*
. Je ne suis pas sûr du sous-répertoire info car il est vide pour ce dépôt.Ce n'est probablement pas nécessaire, mais il convient de noter que cela
git init --bare --shared
définit également l' option denyNonFastForwards .La signification de cette option est la suivante:
(depuis http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration )
la source
En plus des réponses ci-dessus pour autoriser un groupe à lire / écrire, vous devez également ajouter l'utilisateur au groupe (dites «foo»).
Remarque: vous devrez d'abord créer un utilisateur s'il n'existe pas
la source