Error de inserción de Git: no se puede desvincular el antiguo (permiso denegado)

193

En el servidor remoto, tengo un enlace de post-recepción configurado para hacer un pago git de mi repositorio:

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

Pero cuando hago un envío desde mi máquina local al repositorio de git en el servidor, recibo los siguientes mensajes de error:

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

Esto aparece muchas veces, un mensaje de error para casi todos los archivos.

Sin embargo, tengo un archivo README.txt que puedo cambiar usando git, aquí están sus permisos:

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

Pero otros archivos con exactamente el mismo propietario y los mismos permisos, me dan ese error.

En otro repositorio local para otro sitio web, tengo los archivos con el nombre de usuario de mi máquina local como propietario, y cuando presiono al servidor remoto respeta al propietario del servidor remoto de los archivos y funciona de maravilla.

Obviamente parece un error relacionado con los permisos, pero no puedo encontrar una manera de solucionarlo, ¿alguna sugerencia?

rfc1484
fuente

Respuestas:

336

Cuando tiene que desvincular un archivo, debe tener permiso 'w' para el directorio, en el que se encuentra el archivo, no para el archivo ...

Jan Marek
fuente
65
De hecho, ese era el problema, lo arreglé usando sudo chmod -R g+wsobre las carpetas culpables.
rfc1484
1
OMG gracias. Estaba tan molesto con pensar que los permisos eran correctos en el archivo. Tiene sentido que las actualizaciones sean en realidad más mvacciones que sobrescripciones.
doublejosh
1
Cambiar los permisos de directorio me funcionó (¡gracias!) Pero es extraño porque podría sobrescribir manualmente los archivos en cuestión a través de sftp sin ningún problema. Es extraño que cuando git trató de hacer lo mismo, no pudo.
Jonathan Stark
1
También tenga en cuenta que si todavía tiene el archivo abierto, aparecerá este error también. Tuve el mismo error y por eso no pude introducir mis cambios.
Matias
1
El primer carácter de la ls -lpantalla indica el tipo de archivo y no está relacionado con los permisos. Los nueve caracteres restantes están en tres conjuntos, cada uno representando una clase de permisos como tres caracteres. El primer conjunto representa la clase de usuario. El segundo conjunto representa la clase de grupo. El tercer conjunto representa la clase de los demás. El g+win chmod le da gpermiso al conjunto de grupos (el parámetro) para escribir (el wparámetro)
rfc1484
68
sudo chmod -R ug+w .;

Este comando solucionaría el problema. Otorga permisos de escritura a la carpeta.

Rajendra kumar Vankadari
fuente
42

Si está utilizando algún IDE, el problema es que ese archivo fue utilizado por algún proceso. Al igual que tu gato podría estar usando el archivo. Intenta identificar ese proceso en particular y ciérralo. Eso debería resolver tu problema.

Rama Krishna Gollapudi
fuente
13

Tuve el mismo problema y ninguna de las soluciones anteriores funcionó para mí. Eliminé la carpeta ofensiva. Luego:

git reset --hard

Eliminó cualquier archivo persistente para limpiar el estado de git, luego hizo:

git pull

Finalmente funcionó.

NOTA: Si la carpeta era, por ejemplo, una carpeta pública con archivos de compilación, recuerde reconstruir los archivos

wcyn
fuente
Gracias, nada más funcionaba para mí tampoco, eliminarlo parecía ser la única opción.
math0ne
En mi caso, esa carpeta ofensiva es .git
Tushar Kathuria
13

Creo que el problema puede ser con la propiedad de la carpeta, así que configúrela con la propiedad actual

sudo chown -R your_login_name /path/to/folder
Puedes encontrar la solución [aquí] [1]
Soumitra Sarkar
fuente
8

FWIW: tuve un problema similar y no estoy seguro de si esto lo alivió (más allá del mod de permiso): Cerrar Eclipse que estaba usando la rama con este problema.

cellepo
fuente
Del mismo modo, recibí este error cuando se abrió un archivo CSV controlado por versión en Excel. Simplemente cerrando Excel lo resolvió. Esto probablemente también se aplica a otras aplicaciones en Windows y probablemente depende de cómo el programa marca el archivo como abierto durante la edición.
Carel
4

Esta es una vieja pregunta, pero puede ayudar a los usuarios de Mac.

Si está copiando archivos de Time Machine manualmente, en lugar de restaurarlos a través de Time Machine, agregará ACL a todo, lo que puede alterar sus permisos.

Por ejemplo, la sección de este artículo que dice "Cómo corregir los permisos de archivos de Mac OS X" muestra que "todos" tienen permisos personalizados, lo que lo arruina todo:

Permisos incorrectos, de http://dreamlight.com/how-to-fix-mac-os-x-file-permissions

Debe eliminar las ACL de esos directorios / archivos. Esta respuesta de Superusuario entra, pero aquí está el comando:

sudo chmod -RN .

Luego puede asegurarse de que sus directorios y archivos tengan los permisos adecuados. Yo uso 750para directorios y 644para archivos.

kylesimmonds
fuente
3

Recibo este error, y otros errores extraños de git, cuando tengo un servidor ejecutándose (en Intellij). Detener el servidor y volver a intentar el comando git con frecuencia me lo soluciona.

Phil Carter
fuente
3
git reset --hard

Trabajó para mi

kreker
fuente
44
Eso podría ser un poco extremo ya que hace mucho más.
cdaddr
3
sudo chown -R $USER:$USER .

Hizo el trabajo por mí.

BARJ
fuente
2

Tirar puede haber creado un cambio local.

Agregue su archivo sin seguimiento:

git add.

Stash cambios.

escondite

Suelta los cambios locales.

Git escondite

Tire con permiso de sudo

sudo git pull rama remota

usuario2858738
fuente
es todo acerca de la autorización de los archivos locales que no hay nada que ver con git He comando basta con ejecutar con sudo y funcionó por lo que no requieren todos estos pasos
raviramani
Esto fue lo único que funcionó para mí.
Eric
2

Algunos archivos están protegidos contra escritura que incluso git no puede sobreescribirlo. Cambie el permiso de la carpeta para permitir la escritura, por ejemplo, sudo chmod 775 foldername

Y luego ejecutar

git pull 

de nuevo

Carmela
fuente
1

¡Recuerde también verificar el permiso del directorio raíz mismo!

Puedes encontrar:

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

y aparecerá el error 'permiso denegado'.

cadavre
fuente