Erreur Git Push: autorisation insuffisante pour append un object à la firebase database du référentiel

Lorsque j’essaye 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, puisque tous les fichiers étaient du bon groupe, mais la prochaine fois que quelqu’un a modifié une modification, il a créé un nouvel élément dans le dossier des objects 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 enregistrent, mais cela semble être un hack. Des idées? Merci.

Autorisations de réparation

Une fois que vous avez identifié et corrigé la cause sous-jacente (voir ci-dessous), vous souhaiterez réparer les permissions:

 cd /path/to/repo.git sudo chgrp -R groupname . sudo chmod -R g+rwX . find . -type d -exec chmod g+s '{}' + 

Notez que si vous voulez que tout le monde puisse modifier le référentiel, vous n’avez pas besoin du chgrp et vous voudrez changer le chmod en sudo chmod -R a+rwX .

Si vous ne corrigez pas la cause sous-jacente, l’erreur continuera à revenir et vous devrez continuer à relancer les commandes ci-dessus, encore et encore.

Des causes sous-jacentes

L’erreur peut être provoquée par l’un des éléments suivants:

  • Le référentiel n’est pas configuré pour être un référentiel partagé (voir core.sharedRepository dans git help config ). Si la sortie de:

     git config core.sharedRepository 

    n’est pas group ou true ou 1 ou un masque, essayez de courir:

     git config core.sharedRepository group 

    puis réexécutez le chmod récursif et chgrp (voir “Autorisations de réparation” 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”.

    Lorsque core.sharedRepository est true ou group , Git s’appuie sur une fonctionnalité des systèmes d’exploitation GNU (par exemple, chaque dissortingbution Linux) pour s’assurer que les sous-répertoires nouvellement créés appartiennent au bon groupe (groupe dans lequel se trouvent tous les utilisateurs). Cette fonctionnalité est documentée dans la documentation GNU coreutils :

    … [Si] le bit set-group-ID d’un répertoire est défini, les sous-fichiers nouvellement créés héritent du même groupe que le répertoire et les sous-répertoires nouvellement créés héritent du bit set-group-ID du répertoire parent. … [Ce mécanisme permet] aux utilisateurs de partager des fichiers plus facilement, en réduisant la nécessité d’utiliser chmod ou chown pour partager de nouveaux fichiers.

    Cependant, tous les systèmes d’exploitation ne possèdent 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. Vous pouvez également rendre le référentiel accessible en écriture pour le monde entier en exécutant git config core.sharedRepository world (mais git config core.sharedRepository world attention, cela est moins sécurisé).

  • Le système de fichiers ne prend pas en charge le bit setgid (par exemple, FAT). ext2, ext3, ext4 supportent tous le bit setgid. Pour autant que je sache, les systèmes de fichiers qui ne prennent pas en charge le bit setgid ne supportent pas non plus le concept de propriété de groupe, de sorte que tous les fichiers et répertoires appartiennent au même groupe (quel groupe est une option de assembly). Dans ce cas, assurez-vous que tous les utilisateurs Git appartiennent au groupe qui possède tous les fichiers du système de fichiers.
  • Tous les utilisateurs Git ne sont pas dans le même groupe que les répertoires de référentiel. Assurez-vous que le propriétaire du groupe sur les répertoires est correct et que tous les utilisateurs sont dans ce groupe.

Pour Ubuntu (ou tout Linux)

De la racine du projet,

 cd .git/objects ls -al sudo chown -R yourname:yourgroup * 

Vous pouvez dire ce que votre nom et votre groupe devraient être en regardant les permissions sur la majorité des résultats de cette commande ls -al

Note: rappelez-vous l’écanvas à la fin de la ligne sudo

Je voulais juste append ma solution. J’ai eu un repo sur OS X qui possédait root sur certains répertoires et Home (qui est mon répertoire utilisateur) sur les autres, ce qui a provoqué la même erreur que celle indiquée ci-dessus.

Heureusement, la solution était simple. À partir du terminal:

 sudo chown -R Home projectdirectory 

sudo chmod -R ug+w .;

Fondamentalement, le fichier .git/objects ne dispose pas d’permissions en écriture. La ligne ci-dessus accorde l’autorisation à tous les fichiers et dossiers du répertoire.

Une bonne façon de déboguer ceci est la prochaine fois, SSH dans le repo distant, cd dans le dossier objects et faites un ls -al .

Si vous voyez 2 ou 3 fichiers avec des utilisateurs différents: la propriété du groupe est le problème.

Il m’est arrivé par le passé avec certains scripts hérités d’accéder à notre repository git et signifie généralement qu’un utilisateur différent (unix) a poussé / modifié des fichiers en dernier et que votre utilisateur n’est pas autorisé à remplacer ces fichiers. Vous devez créer un groupe git partagé dans lequel se trouvent tous les utilisateurs activés par git, puis chgrp manière récursive le dossier des objects et son contenu pour que son groupe appartienne au groupe git partagé.

Vous devez également append un bit sticky dans le dossier afin que tous les fichiers créés dans le dossier contiennent toujours le groupe de git .

chmod g + s nom-répertoire

Mise à jour: je ne connaissais pas core.sharedRepository. Bon à savoir, même si cela ne fait probablement que ce qui précède.

Cela peut facilement se produire si vous avez lancé git init avec un utilisateur différent de celui que vous prévoyez d’utiliser lors de l’envoi de modifications.

Si vous suivez aveuglément les instructions sur [1], cela se produira car vous avez probablement créé l’utilisateur git 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

Résolu pour moi … juste ça:

 sudo chmod 777 -R .git/objects 

Après avoir ajouté des éléments … engagez-les et après tout fini, poussez-les! COUP!! Commencez tous les problèmes … Comme vous devez le constater, il existe des différences dans la définition des projets nouveaux et existants. Si une autre personne essaie d’append / valider / pousser les mêmes fichiers ou le même contenu (git conserve les deux objects), nous ferons face à l’erreur suivante:

 $ git push Counting objects: 31, done. Delta compression using up to 2 threads. Compressing objects: 100% (17/17), done. Writing objects: 100% (21/21), 2.07 KiB | 0 bytes/s, done. Total 21 (delta 12), reused 0 (delta 0) remote: error: insufficient permission for adding an object to repository database ./objects remote: fatal: failed to write object 

Pour résoudre ce problème, vous devez avoir quelque chose en tête dans le système d’permissions du système opérationnel car vous en êtes limité dans ce cas. Pour mieux comprendre le problème, allez-y et vérifiez le dossier de votre object git (.git / objects). Vous verrez probablement quelque chose comme ça:

 @ objects]$ ls -la total 200 drwxr-xr-x 25   2048 Feb 10 09:28 . drwxr-xr-x 3   1024 Feb 3 15:06 .. drwxr-xr-x 2   1024 Jan 31 13:39 02 drwxr-xr-x 2   1024 Feb 3 13:24 08 

* Notez que les permissions de ces fichiers ont été accordées uniquement pour vos utilisateurs, personne ne pourra jamais les modifier … *

 Level ugo Permission rwx rx --- Binary 111 101 000 Octal 7 5 0 

Résoudre le problème

Si vous avez la permission de super utilisateur, vous pouvez aller de l’avant et modifier toutes les permissions vous-même en utilisant la deuxième étape. Dans tous les cas, vous devrez demander à tous les utilisateurs des objects créés avec leurs utilisateurs. :

 $ ls -la | awk '{print $3}' | sort -u   

Désormais, vous et tous les utilisateurs propriétaires du fichier devrez modifier ces permissions, en procédant comme suit:

 $ chmod -R 774 . 

Après cela, vous devrez append une nouvelle propriété équivalente à –shared = group made pour le nouveau référentiel, selon la documentation, cela rendra le repository de groupe accessible en écriture, faites-le en cours d’exécution:

 $ git config core.sharedRepository group 

https://coderwall.com/p/8b3ksg

Linux, macOS:

 cd .git/ sudo chown -R name:group * 

name est votre nom d’utilisateur et group est le groupe auquel appartient votre nom d’utilisateur.

Pour mon cas, aucune des suggestions n’a fonctionné. Je suis sur Windows et cela a fonctionné pour moi:

  • Copiez le repo distant dans un autre dossier
  • Partagez le dossier et atsortingbuez les permissions appropriées.
  • Assurez-vous de pouvoir accéder au dossier depuis votre ordinateur local.
  • Ajoutez ce repository comme autre repo distant dans votre repo local. ( git remote add foo //SERVERNAME/path/to/copied/git )
  • Poussez pour foo git push foo master . A fonctionné? Génial! Maintenant, supprimez le repo qui ne fonctionne pas et renommez-le en n’importe quoi. Assurez-vous que les permissions et les propriétés de partage restnt les mêmes.

Je frappe ce même problème. En lisant ici, je me suis rendu compte que le message faisait référence à des permissions de fichiers. Le correctif, pour moi, était dans:

/etc/inetd.d/git-gpv

Il commençait par git-daemon car l’utilisateur « personne » n’avait pas la permission d’écrire.

 # Who When What # GPV 20Nov13 Created this by hand while reading: http://linuxclues.blogspot.co.uk/2013/06>/git-daemon-ssh-create-repository-debian.html # GPV 20Nov13 Changed owner (to user_git) otherise nobody lack permission to update the repository #git stream tcp nowait nobody /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo git stream tcp nowait user_git /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo 

(Je doute que d’autres appellent leur fichier de configuration inetd git-gpv. Généralement, ce serait directement dans /etc/inetd.conf)

utilisez la commande suivante, fonctionne comme par magie

 sudo chown -R "${USER:-$(id -un)}" . 

tapez la commande exactement comme elle est (avec des espaces supplémentaires et un point à la fin)

Vous avez peut-être accidentellement nested des référentiels git

Vous avez besoin des permissions d’écriture suffisantes sur le répertoire vers lequel vous poussez.

Dans mon cas: Windows 2008 Server

Faites un clic droit sur le répertoire repo git ou le répertoire parent.

Propriétés> onglet Partage> Partage avancé> Autorisations> assurez-vous que l’utilisateur dispose des droits d’access appropriés.

Notez que cela peut aussi arriver si votre umask est faux. J’ai testé quelques umasks et j’ai oublié de le restaurer à sa valeur par défaut (0022), l’hilarité s’est ensuivie …