Lorsque j'essaie de pousser vers une télécommande git partagée, j'obtiens l'erreur suivante:
insufficient permission for adding an object to repository database
Ensuite, j'ai lu un correctif ici: Fix Cela a fonctionné pour la prochaine poussée, car tous les fichiers étaient du bon groupe, mais la prochaine fois que quelqu'un a poussé une modification, il a fait un nouvel élément dans le dossier des objets qui avait leur groupe par défaut en tant que groupe. La seule chose à laquelle je peux penser est de changer tout le groupe par défaut du développeur pour les éléments qu'ils archivent, mais cela semble être un hack. Des idées? Merci.
git add
etgit commit
-ing en tant qu'utilisateur root. Je l'ai corrigé avec ungit reset
et la réponse à cette question pour corriger les.git
autorisations de répertoire.Réponses:
Autorisations de réparation
Après avoir identifié et corrigé la cause sous-jacente (voir ci-dessous), vous souhaiterez réparer les autorisations:
Notez que si vous voulez que tout le monde puisse modifier le référentiel, vous n'avez pas besoin de
chgrp
et vous voudrez changer le chmod ensudo chmod -R a+rwX .
Si vous ne corrigez pas la cause sous-jacente, l'erreur continuera de se produire et vous devrez continuer à réexécuter les commandes ci-dessus encore et encore.
Des causes sous-jacentes
L'erreur peut être due à l'un des éléments suivants:
Le référentiel n'est pas configuré pour être un référentiel partagé (voir
core.sharedRepository
dansgit help config
). Si la sortie de:n'est pas
group
outrue
ou1
ou un masque, essayez d'exécuter:puis réexécutez le récursif
chmod
etchgrp
(voir "Réparer les autorisations" ci-dessus).Le système d'exploitation n'interprète pas un bit setgid sur les répertoires car "tous les nouveaux fichiers et sous-répertoires doivent hériter du propriétaire du groupe".
Quand
core.sharedRepository
esttrue
ougroup
, Git s'appuie sur une fonctionnalité des systèmes d'exploitation GNU (par exemple, chaque distribution Linux) pour garantir que les sous-répertoires nouvellement créés appartiennent au bon groupe (le groupe dans lequel se trouvent tous les utilisateurs du référentiel). Cette fonctionnalité est documentée dans la documentation GNU coreutils :Cependant, tous les systèmes d'exploitation n'ont pas cette fonctionnalité (NetBSD en est un exemple). Pour ces systèmes d'exploitation, vous devez vous assurer que tous vos utilisateurs Git ont le même groupe par défaut. Alternativement, vous pouvez rendre le référentiel accessible en écriture en exécutant
git config core.sharedRepository world
(mais soyez prudent, c'est moins sécurisé).la source
false
ouumask
). Voirgit help config
pour plus de détails.git push
utilisant un compte root dans mon répertoire de travail. J'ai trouvé que le propriétaire de certains fichiers de référentiel git est root (-r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424
) selon cette réponse.X
, pas une minusculex
. Une majusculeX
signifie "définiS_IXGRP
si le fichier est un répertoire (ou si un autreS_IX*
bit est défini)", donc il ne rendra pas tous les fichiers exécutables. Cela peut être inutile, mais peut-être pas s'il acore.sharedRepository
été défini0600
à un moment donné dans le passé.Pour Ubuntu (ou tout Linux)
Depuis la racine du projet,
Vous pouvez dire ce que devraient être votre nom et votre groupe en examinant les autorisations sur la majorité des résultats de cette commande ls -al
Remarque: rappelez-vous l'étoile à la fin de la ligne sudo
la source
Sorry, user myuser is not allowed to execute '/bin/chown
*
fait toute la différence. Merci.ls .git
utilisez la commande suivante, fonctionne comme par magie
tapez la commande exactement comme elle est (avec des espaces supplémentaires et un point à la fin)
la source
sudo chmod -R ug+w .;
Fondamentalement, le
.git/objects
fichier n'a pas d'autorisations d'écriture. La ligne ci-dessus accorde l'autorisation à tous les fichiers et dossiers du répertoire.la source
Je voulais juste ajouter ma solution. J'avais un dépôt sur OS X qui possédait la propriété de root sur certains répertoires et de Home (qui est mon répertoire utilisateur) sur d'autres, ce qui a provoqué la même erreur répertoriée ci-dessus.
Heureusement, la solution était simple. Depuis le terminal:
la source
Une bonne façon de déboguer ceci est la prochaine fois que cela se produit, SSH dans le référentiel distant, cd dans le dossier des objets et faites un
ls -al
.Si vous voyez 2-3 fichiers avec un utilisateur différent: propriété du groupe, c'est le problème.
Cela m'est arrivé dans le passé avec certains scripts hérités d'accéder à notre dépôt git et signifie généralement qu'un utilisateur différent (unix) a poussé / modifié les fichiers en dernier et que votre utilisateur n'a pas les autorisations pour écraser ces fichiers. Vous devez créer un groupe git partagé dans lequel se trouvent tous les utilisateurs compatibles git, puis récursivement
chgrp
leobjects
dossier et son contenu afin que la propriété du groupe soit legit
groupe partagé .Vous devez également ajouter un élément collant sur le dossier afin que tous les fichiers créés dans le dossier aient toujours le groupe de
git
.Mise à jour: je ne connaissais pas core.sharedRepository. Bon à savoir, même si cela ne fait probablement que ce qui précède.
la source
Résolu pour moi ... juste ceci:
la source
Chmod 777
n'est pas recommandé car il expose tout votre fichier au reste du monde, ce qui rend votre machine vulnérablechmod 777
, 99 fois sur 100, vous ne comprenez pas le problème et vous causerez probablement plus de problèmes que vous ne l'aurez aidé à résoudre. Comme le montre la réponse acceptée ci-dessus, ce problème n'est pas différent.Cela peut facilement se produire si vous avez exécuté
git init
avec un utilisateur différent de celui que vous prévoyez d'utiliser lors de la transmission des modifications.Si vous suivez aveuglément les instructions de [1], cela se produira car vous avez probablement créé git-user en tant que root, puis vous êtes immédiatement passé à git init sans changer d'utilisateur entre les deux.
[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server
la source
Linux, macOS:
où
name
est votre nom d'utilisateur etgroup
est le groupe auquel appartient votre nom d'utilisateur.la source
Après avoir ajouté des trucs ... engagez-les et après tout, poussez-les! COUP!! Commencez tous les problèmes ... Comme vous devez le remarquer, il existe des différences dans la définition des projets nouveaux et existants. Si une autre personne essaie d'ajouter / valider / pousser les mêmes fichiers ou contenus (git conserve les deux comme les mêmes objets), nous ferons face à l'erreur suivante:
Pour résoudre ce problème, vous devez avoir quelque chose à l'esprit du système d'autorisations du système opérationnel car vous êtes limité par lui dans ce cas. Vous comprenez mieux le problème, allez-y et vérifiez le dossier de votre objet git (.git / objects). Vous verrez probablement quelque chose comme ça:
* Notez que les autorisations de ces fichiers ont été accordées uniquement pour vos utilisateurs, personne ne pourra jamais les modifier ... *
RÉSOUDRE LE PROBLÈME
Si vous disposez d'une autorisation de super-utilisateur, vous pouvez aller de l'avant et modifier toutes les autorisations par vous-même en utilisant la deuxième étape, dans tous les autres cas, vous devrez demander à tous les utilisateurs avec des objets créés avec leurs utilisateurs, utilisez la commande suivante pour savoir qui ils sont. :
Maintenant, vous et tous les utilisateurs propriétaires du fichier devrez modifier l'autorisation de ces fichiers en procédant comme suit:
Après cela, vous devrez ajouter une nouvelle propriété équivalente à --shared = group effectuée pour le nouveau référentiel, selon la documentation, cela rendra le groupe du référentiel accessible en écriture, exécutez-le:
https://coderwall.com/p/8b3ksg
la source
username:groupname
pour le mien, mais quand j'ai essayéchmod -R 774 .
, j'ai pu courirgit add --all
avec succès.Pour mon cas, aucune des suggestions n'a fonctionné. Je suis sous Windows et cela a fonctionné pour moi:
git remote add foo //SERVERNAME/path/to/copied/git
)git push foo master
. Cela a-t-il fonctionné? Génial! Maintenant, supprimez le référentiel qui ne fonctionne pas et renommez-le en ce qu'il était auparavant. Assurez-vous que les autorisations et la propriété de partage restent les mêmes.la source
J'ai touché ce même problème. En lisant ici, j'ai réalisé que c'était les autorisations de fichiers auxquelles le message faisait référence. Le correctif, pour moi, était:
/etc/inetd.d/git-gpv
Il commençait git-daemon en tant qu'utilisateur ' nobody ' donc n'avait pas l'autorisation d'écriture.
(Je doute que d'autres appellent leur fichier de configuration inetd git-gpv. Généralement, ce serait directement dans /etc/inetd.conf)
la source
Vous avez besoin des autorisations d'écriture suffisantes sur le répertoire vers lequel vous appuyez.
Dans mon cas: serveur Windows 2008
clic droit sur le répertoire git repo ou le répertoire parent.
Propriétés> onglet Partage> Partage avancé> Autorisations> assurez-vous que l'utilisateur dispose des droits d'accès appropriés.
la source
Vous pouvez avoir des référentiels git imbriqués accidentellement
la source
Il est également possible que vous ayez ajouté un autre référentiel local avec le même alias. Par exemple, vous avez maintenant 2 dossiers locaux appelés
origin
ainsi lorsque vous essayez de pousser, le référentiel distant n'acceptera pas vos informations d'identification.Renommez les alias du référentiel local, vous pouvez suivre ce lien https://stackoverflow.com/a/26651835/2270348
Vous pouvez peut-être laisser 1 référentiel local de votre choix au fur
origin
et à mesure que les autres les renomment par exemple deorigin
àanotherorigin
. N'oubliez pas que ce ne sont que des alias et que tout ce que vous avez à faire est de vous souvenir des nouveaux alias et de leurs branches distantes respectives.la source
Travaille pour moi
la source
Je l'ai obtenu en entrant dans un projet Rstudio. J'ai réalisé que j'avais oublié de faire:
au démarrage du programme. En fait, comme il y a un autre bug que j'ai, je dois réellement faire:
la source
Utilisez sudo pour commit -m
la source
J'obtenais ce problème avec un référentiel distant sur un partage Samba; J'ai réussi à tirer de cette télécommande, mais j'ai échoué en poussant dessus.
La cause de l'erreur était des informations d'identification incorrectes dans mon
~/.smbcredentials
fichier.la source