J'ai un référentiel Git sur un serveur de transfert que plusieurs développeurs doivent pouvoir exploiter. git-init
semble avoir un drapeau très proche de ce que je recherche:, --shared
sauf que j'aimerais que plusieurs personnes se rendent dans ce référentiel également. Le git-clone
« s --shared
drapeau fait quelque chose de tout à fait différent.
Quel est le moyen le plus simple de modifier les autorisations d'un référentiel existant?
permissions
git
users
share
Andreï Fedorov
la source
la source
Réponses:
Les autorisations sont un ravageur.
En gros, vous devez vous assurer que tous ces développeurs peuvent écrire dans tout le référentiel git.
Passez à la solution New-Wave pour la méthode supérieure d’octroi de capacités d’écriture à un groupe de développeurs.
La solution standard
Si vous placez tous les développeurs dans un groupe spécialement créé, vous pouvez en principe simplement:
Modifiez ensuite le paramètre
umask
pour les utilisateurs002
afin que les nouveaux fichiers soient créés avec des autorisations accessibles en écriture au groupe.Les problèmes avec ceci sont légion; Si vous êtes sur une distribution qui suppose un
umask
de022
(comme avoir unusers
groupe commun qui inclut tout le monde par défaut), cela peut créer des problèmes de sécurité ailleurs. Et tôt ou tard, quelque chose va bousiller votre système de permissions soigneusement conçu, mettant le référentiel hors d’action jusqu’à ce que vous obteniez unroot
accès et le corrigiez (c’est-à-dire, relancez les commandes ci-dessus).La solution New-Wave
Une solution supérieure - bien que moins bien comprise et nécessitant un peu plus de prise en charge des systèmes d’exploitation / des outils - consiste à utiliser les attributs étendus POSIX. Je ne suis venu dans cette région que récemment, donc mes connaissances ne sont pas aussi intéressantes que possible. Mais fondamentalement, une liste de contrôle d'accès étendue permet de définir des autorisations sur plus de 3 emplacements par défaut (utilisateur / groupe / autre).
Alors encore une fois, créez votre groupe, puis lancez:
Cela configure la liste de contrôle d'accès étendue pour le groupe afin que les membres du groupe puissent lire / écrire / accéder aux fichiers déjà présents (la première ligne); Ensuite, indiquez également à tous les répertoires existants que la même liste de contrôle d'accès doit être appliquée aux nouveaux fichiers (la deuxième ligne).
J'espère que cela vous amène sur votre chemin.
la source
chmod -R g+swX
, cela a rendu Git très malheureux et il a décidé que ce n’était plus un référentiel git ("repo ne semble pas être un référentiel git"). Je devais vérifier tous les fichiers . Pour définir simplement le bit setgid sur les répertoires , essayezfind /path/to/repo -type d -print0 | xargs -0 chmod g+s
. Toujours faire lechgrp -R thegroup /path/to/repo
.chmod -R g+swX gitrepo
appliquera le bit setguid aux fichiers, ce qui constitue un risque pour la sécurité. Au lieu de cela, vous pouvez utiliserfind . -type d -exec chmod g+s {} +
pour l'appliquer uniquement aux répertoires.si vous avez créé le référentiel (ou cloné un nouveau référentiel nu sur un référentiel existant) avec
ou
Git est supposé gérer les autorisations au-delà de ce que votre umask par défaut fournit. Enfin, cela est vrai sur ma version de Git (1.6.3). Bien entendu, cela suppose que vos utilisateurs appartiennent au même groupe.
Si j'avais besoin de gérer des utilisateurs dans plusieurs groupes avec des degrés variables de lecture / écriture, je choisirais la gitose. J'ai aussi entendu parler de gitolite ( http://github.com/sitaramc/gitolite ), un fork de gitosis qui est supposé fournir des autorisations au niveau de la branche, mais je ne peux pas dire que je l'ai tous personnellement utilisé.
la source
--shared
argument prend une valeur octale, pas hexadécimale. Je l'ai confirmé dans la source de Git 1.7.8 et le deuxième exemple devrait l'êtregit init --shared=0NNN
.NNN
ce que le masque de permission, un numéro de groupe ou autre chose?git init --bare --shared=group myproj
référentiel, il s'agit de myproj, le nom de votre référentiel, suivi de celuichgrp -R mygroup myproj
où mygroup est votre nom de groupe.Cela n'a pas été dit, je veux donc l'ajouter rapidement.
Pour vous assurer que les problèmes d'autorisations ne coupent pas leur tête laide, assurez-vous de définir les éléments suivants dans le fichier de configuration de votre référentiel partagé git:
Cela garantira que les paramètres "umask" de votre système sont respectés.
la source
git config core.sharedRepository true
.git init --shared
estgit clone --config core.sharedRepository=true
. Etrange de git à utiliser--shared
pour des significations si différentes dans des commandes similaires.Le manuel de l'utilisateur Git explique comment partager un référentiel de plusieurs manières.
Les moyens les plus complexes de partage de référentiels, bien que comportant de nombreuses fonctionnalités, sont les suivants:
Nous utilisons GitHub pour une équipe de 6 développeurs.
la source
Consultez également gitolite pour l'hébergement de votre référentiel git. La gitose n'est apparemment plus en train de se développer.
la source
Un moyen de corriger les autorisations dans le référentiel partagé, afin d'éviter les problèmes d'autorisations lors de l'insertion, consiste à créer un script de hook post-mise à jour qui le fera exactement. Cela devrait fonctionner dans n'importe quelle version de Git.
Supposons que vous ayez un référentiel partagé dans /myrepo.git. Tous les fichiers de ce dépôt appartiennent à mysharedgroup . Tous les utilisateurs poussant vers ce référentiel doivent également appartenir à mysharedgroup . Créez maintenant le fichier suivant (en modifiant mysharedgroup selon vos préférences):
/myrepo.git/hooks/post-update
la source
/dev/null
. S'il vous plaît laissez l'utilisateur voir ces messages d'abord et ensuite décider de leur propre chef.Pour regrouper les éléments de bon conseil des différentes autres réponses et commentaires sur la mise en place d'un nouveau référentiel:
Si vous configurez un nouveau repo
myrepo
dans/srv/git
le groupemygroup
, c'est ce que vous voulez:mygroup
core.bare = true
: en faire un repo nucore.sharedrepository = 1
(identique àcore.sharedrepository = group
): le répertoire repo et tous les répertoires créés ultérieurement y seront gérés par git pour permettre les autorisations demygroup
lecture, d’écriture et d’exécution (avec le bit sgid également défini - de manière à fonctionner avec des utilisateurs pour lesquels ilsmygroup
ne sont pas les leurs. groupe primaire)receive.denyNonFastforwards = 1
: refuser les poussées non rapides vers le repoSi vous souhaitez ajuster avec précision les autorisations des utilisateurs, des groupes ou des autres utilisateurs, utilisez l'
--shared=0NNN
emplacement où seNNN
trouvent l'utilisateur, le groupe et les autres bits standard des fichiers (les bits execute et sgid des répertoires seront gérés de manière appropriée par git). Par exemple, cela permet un accès en lecture et en écriture à l'utilisateur, ainsi qu'un accès en lecture seule au groupe (et aucun accès aux autres):Cela permet un accès en lecture et en écriture à l'utilisateur et au groupe (et aucun accès aux autres):
Cela permet un accès en lecture et en écriture à l'utilisateur et au groupe, ainsi qu'un accès en lecture seule à d'autres:
Notez que si vous n'autorisez pas l'accès en écriture au groupe, assurez-vous d'abord
chown
de définir le propriétaire du référentiel, puis exécutez lagit init
commande en tant qu'utilisateur (pour vous assurer que le référentiel est initialisé avec le propriétaire correct tous les fichiers et sous-répertoires initiaux).la source
Vous pouvez utiliser git-daemon pour partager le référentiel. Lisez la documentation de git-daemon pour plus d'informations.
MODIFIER:
Consultez également cet article sur 8 façons de partager votre référentiel git .
la source
Faire exactement cela a fonctionné pour moi, pour un référentiel existant. Cela prend conseil de plusieurs réponses et commentaires avant:
À partir du répertoire parent de votre référentiel, sur le serveur:
la source
@stevek_mcc la réponse est celle que je cherchais quand j'ai cherché sur Google pour cette question
la source