web-dev-qa-db-fra.com

Erreur Git Push: impossible de dissocier l'ancien (autorisation refusée)

Sur le serveur distant, un hook de post-réception est configuré pour effectuer une extraction git de mon référentiel:

#!/bin/sh
GIT_WORK_TREE=/var/www/<website> git checkout -f

Mais lorsque je crée un Push de ma machine locale vers le référentiel git du serveur, les messages d'erreur suivants sont générés:

remote: error: unable to unlink old '<file>' (Permission denied)

Cela apparaît plusieurs fois, un message d'erreur pour presque tous les fichiers.

Cependant, j'ai un fichier README.txt que je peux modifier avec git, voici ses permissions:

-rw-r--r--  1 <serverusername>  <serverusername>  2939 Aug  2 10:58 README.txt

Mais d'autres fichiers avec exactement le même propriétaire et les mêmes autorisations me donnent cette erreur.

Dans un autre référentiel local pour un autre site Web, j'ai les fichiers avec le nom d'utilisateur de mon ordinateur local en tant que propriétaire. Lorsque j'appuie sur le serveur distant, il respecte le propriétaire des fichiers du serveur distant et fonctionne à merveille.

De toute évidence, cela semble être une erreur liée aux autorisations, mais je ne trouve pas de moyen de la résoudre, des suggestions?

151
rfc1484

Lorsque vous devez dissocier le fichier, vous devez disposer de l'autorisation 'w' pour le répertoire dans lequel le fichier se trouve, pas pour le fichier ...

265
Jan Marek
Sudo chmod -R ug+w .;

Cette commande résoudrait le problème. Il donne des autorisations d'écriture au dossier.

40

Si vous utilisez un IDE, le problème est probablement lié au fait que le fichier a été utilisé par un processus quelconque. Comme votre Tomcat pourrait utiliser le fichier. Essayez d'identifier ce processus particulier et fermez-le. Ceci devrait régler votre problème. 

34

J'ai eu le même problème et aucune des solutions ci-dessus n'a fonctionné pour moi. J'ai supprimé le dossier incriminé. Ensuite: 

git reset --hard

Supprimé tous les fichiers en attente pour nettoyer le statut de git, puis:

git pull

Cela a finalement fonctionné.

REMARQUE: Si le dossier était, par exemple, un dossier public avec des fichiers de construction, pensez à reconstruire les fichiers.

6
wcyn

FWIW - J'ai eu un problème similaire et je ne sais pas si cela l'a atténué (au-delà du mod. Autorisation): Fermer Eclipse qui utilisait la branche avec ce problème.

5
cellepo

C'est une vieille question, mais cela peut aider les utilisateurs de Mac.

Si vous copiez manuellement des fichiers à partir de Time Machine, au lieu de les restaurer via Time Machine, il ajoutera ACLs à tout ce qui peut gâcher vos autorisations.

Par exemple, la section de cet article qui dit "Comment réparer les autorisations de fichiers Mac OS X" indique que "Tout le monde" a des autorisations personnalisées, ce qui complique tout:

Bad permissions, from http://dreamlight.com/how-to-fix-mac-os-x-file-permissions

Vous devez supprimer les ACL de ces répertoires/fichiers. Cette réponse du super utilisateur va dans, mais voici la commande:

Sudo chmod -RN .

Ensuite, vous pouvez vous assurer que vos répertoires et fichiers disposent des autorisations appropriées. J'utilise 750 pour les répertoires et 644 pour les fichiers.

3
kylesimmonds
git reset --hard

A travaillé pour moi

2
kreker

Je reçois cette erreur, ainsi que d’autres erreurs git étranges, lorsque j’ai un serveur en fonctionnement (dans Intellij). Arrêter le serveur et réessayer la commande git me le corrige fréquemment.

2
Phil Carter

Certains fichiers sont protégés en écriture et même git ne peut pas les écrire. Modifiez l'autorisation du dossier pour autoriser l'écriture, par exemple. Sudo chmod 775 NomDossier

Et puis git tire à nouveau

1
Carmela

Pensez également à vérifier l'autorisation du répertoire racine lui-même!

Vous pouvez trouver:

drwxr-xr-x  9 not-you www-data  4096 Aug  8 16:36 ./
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 README.txt
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 UPDATE.txt

et l'erreur 'permission refusée' apparaîtra.

0
cadavre

Je pense que le problème peut être avec la propriété du dossier, donc définissez-le sur le propriétaire actuel

Sudo chown -R your_login_name /path/to/folder
0
Soumitra Sarkar

Tirer peut avoir créé un changement local.

Ajoutez votre fichier non suivi:

git add.

Cacher les changements.

git stash

Supprimez les modifications locales.

git Stash Drop

Tirez avec la permission de Sudo

Sudo git pull branche distante

0
user2858738