Git push no puede escribir en el archivo objeto: permiso denegado

Git push no puede escribir en el archivo objeto: permiso denegado

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.

  1. Soy usuario1@host1 y creo un repositorio de git simple usando:

    mkdir /local/git-repos
    cd /local/git-repos
    git init --bare repo1.git
    
  2. 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
    
  3. 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.

  4. 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 user1y otros archivos propiedad de user2. El problema es que más adelante, cuando user1se intenta enviar archivos al GIT HOST, objectes posible que los archivos y directorios creados sean propiedad de él, user2por 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 GROUPpermisos.

  5. 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 ( giten 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).

información relacionada