Estoy en un repositorio clonado e intento acceder a mi rama remota. Confirmar funciona bien, sin embargo, cada vez que intento presionar me sale esto:
error: unable to write file ./objects/foo/bar: Permission denied
Soy dueño de todos los archivos en el repositorio local y, por lo general, la transferencia funciona bien; sin embargo, después de un tiempo, ocurre este error y no puedo enviar.
Lo único que resuelve el problema es volver a la última confirmación en el origen e intentar encontrar el archivo que se supone que está causando el problema.
Luego toco un archivo nuevo y pego el contenido del archivo antiguo "roto". A veces esto tampoco ayuda y, obviamente, no es una solución manejable.
Respuesta1
Me encontré con este problema y encontré esta pregunta. Leí el consejo publicado enhttps://www.thegeekstuff.com/2017/05/git-push-error/y resumiré lo que solucionó el problema (para mí).
La solución fue configurar el host que contiene GIT REPO para que contuviera un grupo compartido al que se agregaran todos los usuarios de git. Por ejemplo, /etc/grupo
git:x:4001:user1,user2
A continuación, en el host que contiene el repositorio de git, ejecute los siguientes comandos:
cd /local/git-repos/repo1.git
sudo chgrp -R git objects
sudo chmod -R g+rws objects
Para mí esto solucionó el problema. El artículo al que se hace referencia explica más sobre cómo configurar un repositorio como repositorio compartido, pero (todavía) no lo he hecho.
git config core.sharedRepository group
¿Por qué puede suceder esto? Sigue leyendo si estás interesado.
Por qué pasó esto
Para mí, esto sucedió cuando configuré un repositorio de git privado que yo (usuario1) estaba compartiendo con algunos compañeros de trabajo. El repositorio estaba en mi host (digamos host1) y usuario2@host2 también lo estaba usando.
A continuación se detallan los pasos que seguí para configurar esto y, en el lugar apropiado, explico dónde ocurre el problema.
Soy usuario1@host1 y creo un repositorio de git simple usando:
mkdir /local/git-repos cd /local/git-repos git init --bare repo1.git
Configuré un archivo ~/.ssh/config para que el nombre usado para el repositorio de git sea un nombre lógico. Esto se hace para que si muevo mi caja a otra máquina, todo lo que tengo que hacer es actualizar mi alias de host al nuevo nombre de computadora.
Archivo:
$HOME/.ssh/config
Host mygithost HostName host1
Luego clono el repositorio usando
cd $HOME git clone mygithost:/local/git-repos/repo1.git cd repo1 # Add files and use normal git commands git add -u . git commit git push
Las actualizaciones se envían al repositorio de git en la computadora.
Configure el usuario2 para que pueda acceder a este mismo repositorio GIT
- Necesitará configurar el archivo $HOME/.ssh/config como lo hizo para el usuario1.
- Asegúrese de que el usuario tenga un ssh en host1 como él mismo.
ssh user2@mygithost echo it worked cd $HOME git clone mygithost:/local/git-repos/repo1.git
En este punto, ambos usuarios, usuario1 y usuario2, pueden acceder al repositorio GIT compartido.
SiAMBOSlos usuarios realizan confirmaciones, entonces los archivos objeto git REPO tendrán algunos archivos propiedad de
user1
y otros archivos propiedad deuser2
. El problema es que más adelante, cuandouser1
se intenta enviar archivos al GIT HOST,object
es posible que los archivos y directorios creados sean propiedad de él,user2
por lo que se produce el siguiente error.error: insufficient permission for adding an object to repository database ./objects fatal: failed to write object error: unpack failed: unpack-objects abnormal exit ! [remote rejected] master -> master (n/a (unpacker error)) error: failed to push some refs to [email protected]:/home/git/myproj
La solución es configurar el repositorio de git bare para que cualquier usuario pueda leer/escribir archivos creados por cualquier otro usuario. Esto se hace en el siguiente paso usando
UNIX GROUP
permisos.Configure el REPO para que diferentes usuarios puedan acceder al repositorio de git.
Crear un GRUPO del que todos los usuarios puedan formar parte
sudo vi /etc/group git:x:4001:user1,user2
Cambie todos los archivos para que estén correctamente en el grupo recién creado.
cd /local/git-repos/repo1.git sudo chgrp -R git objects sudo chmod -R g+rws objects
Utilice cualquier grupo compartido que haya creado anteriormente (
git
en este ejemplo).
NOTA: El bit group-suid es importante ya que hace que los archivos/directorios futuros que se creen conserven la misma configuración que el directorio principal. Dehttps://www.redhat.com/sysadmin/suid-sgid-sticky-bit, dice:
Si se configura en un directorio, cualquier archivo creado en el directorio tendrá su propiedad de grupo configurada como la del propietario del directorio.
Resumen
Este error no debería ocurrir normalmente en ningún GIT REPO alojado normalmente. Pero puede suceder en la situación descrita en la que varios usuarios configuran y comparten un repositorio privado (basado en archivos).