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?
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 ...
Sudo chmod -R ug+w .;
Cette commande résoudrait le problème. Il donne des autorisations d'écriture au dossier.
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.
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.
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.
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:
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.
git reset --hard
A travaillé pour moi
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.
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
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.
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
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