Error al presionar a GitHub: permiso insuficiente para agregar un objeto a la base de datos del repositorio

126

Estoy recibiendo un error inusual al intentar hacer un "git push" en mi repositorio de GitHub:

Contando objetos: 8, hecho.
Compresión Delta utilizando 2 hilos.
Comprimir objetos: 100% (4/4), hecho.
Escribir objetos: 100% (5/5), 1.37 KiB, hecho.
Total 5 (delta 2), reutilizado 0 (delta 0)
error: permiso insuficiente para agregar un objeto a la base de datos del repositorio ./objects

fatal: no se pudo escribir el objeto
error: desempaquetar objetos salidos con el código de error 128
error: descomprimir falló: desempaquetar objetos salida anormal
A [email protected]: bixo / bixo.git
 ! [rechazado remotamente] maestro -> maestro (n / a (error del desempacador))
error: no se pudieron enviar algunas referencias a '[email protected]: bixo / bixo.git'
  • Después de un clon limpio de GitHub, puedo editar / agregar / confirmar / enviar un archivo modificado.
  • Si luego repito esto por segunda vez me sale el error anterior.
  • Puedo empujar a otros repositorios de GitHub muy bien.
  • He revisado los permisos de archivo / directorio de mi lado, y parecen estar bien.
  • Estoy ejecutando git 1.6.2.3 en Mac OS X 10.5.8

El repositorio anterior fue la fuente de mi diversión para una pregunta anterior de Stack Overflow ( SO 1904860 ), por lo que tal vez el repositorio de GitHub se corrompió. El único problema similar que encontré a través de la búsqueda fue un problema de desempaquetado reportado en github. ¿Alguien más se ha encontrado con este problema antes, especialmente cuando no usa GitHub?

kkrugler
fuente
1
Otra pista para las personas con este error: recibí este error porque estaba usando el usuario incorrecto para presionar. Mi servidor tiene usuario fooy git; ambos pueden leer /opt/git/<repo>, pero solo gitpueden escribirle. gitpredeterminado para el usuario actual si no se proporciona ninguno .git/config, lo cual olvidé. Ninguna de las elaboradas respuestas a continuación fueron necesarias.
Sebastian

Respuestas:

209

Cuando vea este error fuera de github, aquí hay un remedio.

Obtuve esto de: http://mapopa.blogspot.com/2009/10/git-insufficient-permission-for-adding.html

ssh me@myserver
cd repository/.git

sudo chmod -R g+ws *
sudo chgrp -R mygroup *

git config core.sharedRepository true

Después de esto, el demonio git debería usar los permisos de archivo de grupo al escribir en .git / objects.

syvex
fuente
44
+1 Funcionó para nosotros. ¿Para qué sirve la 's' sudo chmod -R g+ws *?
Erik B
55
Esto permitirá que cualquier archivo nuevo creado por otro usuario mantenga los permisos de grupo del directorio raíz. De lo contrario, tendrá errores al subir al repositorio. Ver setuid y setgid
syvex
Obtuve el mismo error con Gitorious en Debian 6 y PHPStorm IDE, con este mensaje "error: permiso insuficiente para agregar un objeto a la base de datos del repositorio .git / objects". Utilicé esta solución en la carpeta principal del proyecto, funciona bien con el "truco + s".
Benj
3
repo-config está obsoleto. Debe ser git config core.sharedRepository true.
lpapp
44
Nota: si usa el comodín " ", ¡los archivos y carpetas ocultos (como .git!) Podrían no verse afectados! Entonces, si lo anterior no funciona para usted, ejecute los comandos para ./.git también
Ben Rogmans
54

Por lo general, este problema es causado por permisos de usuario y grupo incorrectos en el sistema de archivos de sus servidores Git. El repositorio de git debe ser propiedad del usuario y también de su grupo.

Ejemplo:

Si su usuario se llama "git", su grupo "gitgroup" y la ubicación del repositorio de Git es: [email protected]: ruta / a / repo.git

entonces haz un:

sudo chown -R git: ruta del grupo git / a / repo.git /

Esto solucionó el error de permiso de git insuficiente para mí.

Bijan
fuente
chown: usuario no válido: `git: git '
Alan Coromano
44
@MariusKavansky prueba $ USER: $ USER en lugar de git: git
dwurf
Esto funciona solo por algún tiempo en mi caso. Tengo que rehacerlo después de algunos empujones.
BuZZ-dEE
Esta es la mejor respuesta, pero debe decir que puede limitar el chown a ".git / objects" y el usuario al que llama "git" es solo el usuario con el que inició sesión. El hecho de que el usuario sea conocido o no por el servidor git no es importante.
Tristan
34
sudo chmod 777 -R .git/objects
Farid Movsumov
fuente
44
Esto funcionó para mí ... pero WTF? He estado actualizando el repositorio durante meses y esto de repente comenzó esta tarde ...
GojiraDeMonstah
La solución para mí fue casi la misma, pero implicó cambiar / corregir el propietario de algunos de los archivos en el directorio .git. Había realizado un mantenimiento de git mientras estaba conectado como 'root', y esto parecía haber cambiado el propietario a root o creado algunos archivos nuevos con el propietario de root en el que confiaba git. Tenía un script de implementación automática ejecutándose bajo el propietario 'apache' que luego dejó de funcionar.
coatesap
9
chmod 777nunca es una buena solución, solo una solución insegura. Pruebe la respuesta de @ Syvex en su lugar (con setgid)
4wk_
10

Esto me sucedió cuando lo intenté git pull. Algunos análisis mostraron que alguien se había comprometido con la raíz en el pasado, creando así algunos objetos con propiedad de raíz .git/objects.

Entonces corrí

cd <repo>
la .git/objects/

y eso mostró la rootpropiedad de algunos objetos (directorios) como este:

user@host:/repo> la .git/objects/
total 540
drwxr-xr-x 135 user user 4096 Jun 16 16:29 .
drwxr-xr-x   8 user user 4096 Jun 16 16:33 ..
drwxr-xr-x   2 user user 4096 Mar  1 17:28 01
drwxr-xr-x   2 user user 4096 Mar  1 17:28 02
drwxr-xr-x   2 user user 4096 Jun 16 16:27 03
drwxr-xr-x   2 user user 4096 Mar  3 13:22 04
drwxr-xr-x   2 root root 4096 Jun 16 16:29 05
drwxr-xr-x   2 user user 4096 Jun 16 16:28 07
drwxr-xr-x   2 root root 4096 Jun 16 16:29 08

Entonces corrí

sudo chown -R user:user .git/objects/

¡Y funcionó!

Estaba reemplazando usuario con mi usuario real, por supuesto.

Thomas
fuente
4

Nada de lo anterior funcionó para mí. Un par de horas más tarde encontré la razón del problema: utilicé una URL de repositorio del tipo

ssh://[email protected]/~git/repo.git

Lamentablemente, almacené una sesión de masilla con el nombre example.comque se configuró para iniciar sesión como usuariomyOtherUser .

Entonces, aunque pensé que git se conecta al host example.comcon el usuario 'git', Git / TortoiseGit se ha conectado a la sesión de masilla example.comque usa el usuario myOtherUser. Esto lleva al mismo ..insufficient permission..error exacto (porque ambos usuarios están en grupos diferentes).

Solución: cambie el nombre de la sesión de masilla example.coma[email protected]

Zensursula
fuente
4

chmod debe ser conocido, por lo que la línea correcta es:

sudo chown -R gituser:gituser objects
rubyan
fuente
3

Por extraño que parezca, tuve este problema en un clon del repositorio que tenía, pero no en otro que tenía. Además de volver a clonar el repositorio (que un compañero de trabajo hizo para solucionar este problema con éxito), logré hacer un "restablecimiento de git" al compromiso que tenía antes de que comenzaran las fallas. Luego volví a confirmar los cambios y pude presionar con éxito después de eso. Entonces, a pesar de todas las indicaciones, hubo un problema en el servidor, en este caso aparentemente era indicativo de alguna rareza en el repositorio local.

dotdotdotPaul
fuente
3

Recibía este error porque cada vez que un usuario empuja algún contenido, el grupo del archivo cambia al usuario. Y luego, si algún otro usuario intentó ingresar al repositorio, causó un error de permiso y el envío fue rechazado. Por lo tanto, es necesario pedirle a su administrador de sistemas que cambie la configuración del repositorio para que ningún usuario pueda cambiar el grupo de cualquier archivo en el repositorio.

Para evitar este problema, asegúrese de que cuando inicialice su repositorio git, use el comando "git init --shared = group".

Arun Chaudhary
fuente
para obtener más explicaciones, puede ver el enlace stackoverflow.com/questions/16183345/…
Arun Chaudhary
2

Si aún recibe este error más tarde después de configurar los permisos, es posible que deba modificar su máscara de creación. Descubrimos que nuestras nuevas confirmaciones (carpetas debajo de los objetos) todavía se estaban creando sin permiso de escritura grupal, por lo tanto, solo la persona que las comprometió podía ingresar al repositorio.

Lo arreglamos configurando la máscara de usuario de los usuarios de SSH en 002 con un grupo apropiado compartido por todos los usuarios.

p.ej

umask 002

donde el 0 central permite la escritura grupal por defecto.

scipilot
fuente
¿Estás seguro de que existe tal comando en Unix o Linux? Porque estoy bastante seguro de que umask no es específico de la ubicación.
Jan Hudec
Sí, lo siento, tienes razón, no sé por qué pensé que tenía un parámetro de directorio adicional. Simplemente se aplica al usuario. He actualizado el comentario.
scipilot
2

Después de agregar algunas cosas ... compromételas y, después de todo, ¡presiónalo! ¡¡EXPLOSIÓN!! Comience todos los problemas ... Como debe notar, hay algunas diferencias en la forma en que se definieron los proyectos nuevos y existentes. Si alguna otra persona intenta agregar / confirmar / enviar los mismos archivos o contenido (git mantiene ambos como los mismos objetos), nos enfrentaremos al siguiente error:

$ git push
Counting objects: 31, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (21/21), 2.07 KiB | 0 bytes/s, done.
Total 21 (delta 12), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects  remote: fatal: failed to write object

Para resolver este problema, debe tener en cuenta el sistema de permisos del sistema operativo, ya que en este caso está restringido. Para comprender mejor el problema, continúe y verifique la carpeta de su objeto git (.git / objects). Probablemente verá algo así:

<your user_name>@<the machine name> objects]$ ls -la
total 200
drwxr-xr-x 25 <your user_name> <group_name> 2048 Feb 10 09:28 .
drwxr-xr-x  3 <his user_name> <group_name> 1024 Feb  3 15:06 ..
drwxr-xr-x  2 <his user_name> <group_name> 1024 Jan 31 13:39 02
drwxr-xr-x  2 <his user_name> <group_name> 1024 Feb  3 13:24 08

* Tenga en cuenta que esos permisos de archivo se otorgaron solo para sus usuarios, nadie nunca podrá cambiarlo ... *

Level       u   g   o
Permission rwx r-x ---
Binary     111 101 000
Octal       7   5   0

RESOLVIENDO EL PROBLEMA

Si tiene permiso de superusuario, puede avanzar y cambiar todos los permisos usted mismo utilizando el paso dos, en cualquier otro caso deberá preguntar a todos los usuarios con objetos creados con sus usuarios, utilice el siguiente comando para saber quiénes son :

$ ls -la | awk '{print $3}' | sort -u 
<your user_name>
<his user_name>

Ahora usted y todos los usuarios propietarios del archivo tendrán que cambiar el permiso de esos archivos, haciendo lo siguiente:

$ chmod -R 774 .

Después de eso, deberá agregar una nueva propiedad que sea equivalente a --shared = group done para el nuevo repositorio, de acuerdo con la documentación, esto hace que el repositorio sea editable en grupo, ejecute:

$ git config core.sharedRepository group

https://coderwall.com/p/8b3ksg

helmedeiros
fuente
2

Intenta hacer lo siguiente:

Ir a su servidor

    cd rep.git
    chmod -R g+ws *
    chgrp -R git *
    git config core.sharedRepository true

Luego vaya a su copia de trabajo (repositorio local) y vuelva a empaquetarla git repack master

Funciona perfectamente para mi.

Aleksei
fuente
2

puedes usar esto

sudo chown -R $USER:$USER "$(git rev-parse --show-toplevel)/.git"
Tấn Tâm
fuente
1
¿Qué está haciendo esto? ¿Puedes agregar una explicación?
Anubian Noob
esto obtendrá el directorio de nivel superior de su repositorio, por lo que el comando funcionará independientemente de en qué parte del repositorio se encuentre actualmente. Si ya está en la raíz, puede ejecutar sudo chown -R $ USER: $ USER .git
Tấn Tâm
Edítalo en tu pregunta. De lo contrario, su pregunta es bastante inútil.
Anubian Noob
2
sudo su root

chown -R user:group dir

El directorio es tu repositorio de git.

Entonces hazlo:

git pull origin master

Verá cambios sobre los compromisos de otros.

usuario3544610
fuente
2
 user@M063:/var/www/html/app/.git/objects$ sudo chmod 777 -R .git/objects
 user@M063:/var/www/html/app/.git/objects$ sudo chown -R user:user .git/objects/
Mohd Bashir
fuente
1

OK, resulta que fue un problema de permisos en GitHub que sucedió durante la bifurcación de emi / bixo a bixo / bixo. Una vez que Tekkub los arregló, comenzó a funcionar nuevamente.

kkrugler
fuente
¿Qué pasó y cómo lo arreglaste? Sé que fue hace un tiempo ... ¿alguna idea?
Metagrapher
1
Era un problema del lado de GitHub, así que no sé exactamente qué hicieron para solucionarlo, solo que "Tekkub" en GitHub dijo "Arregle los permisos" y luego funcionó.
kkrugler
Frio. Gracias por la info. Terminé re-clonando el repositorio. Subóptimo, pero funcionó. ¡Salud!
Metagrapher
44
Nosotros, uh, arreglamos la falla . Por lo tanto, ya no recibirá un cheque de pago, por lo que se resolverá de forma natural.
Alan
1

Dado que el error trata de los permisos en la carpeta de objetos, hice un chown directamente en la carpeta de objetos y funcionó para mí.

n00shie
fuente
1

Esto funciona:

sudo chmod -R gituser.gituser objects
eeepage
fuente
1
No. chmodcambia los permisos del archivo y necesita modos como argumentos, no usuarios y grupos. Es chmod -R ${some_octal_num} blao bienchown -R ${some_user}:${some_group} bla
Dennis Winter
1

Supongo que muchos como yo terminan en foros como este cuando se produce el problema git como se describe anteriormente. Sin embargo, hay tantas causas que pueden conducir al problema que solo quiero compartir lo que causó mis problemas para que otros aprendan como ya aprendí desde arriba.

Tengo mis repositorios en un NAS de Linux de sitecom (nunca compre NAS de Sitecom, por favor). Tengo un repositorio aquí que está clonado en muchas computadoras, pero que de repente se me negó presionar. Recientemente instalé un complemento para que mi NAS pudiera funcionar como un servidor squeezebox.

Este servidor busca medios para compartir. Lo que no sabía era que, posible debido a un error, el servidor cambia la configuración de usuario y grupo para exprimir: usuario para todos los archivos que busca. Y eso es TODOS los archivos. Alterando así los derechos que tenía que presionar.

El servidor se fue y se restablecieron los ajustes de derechos adecuados y todo funciona perfectamente.

solía

chmod -R g+ws *
chown -R <myuser>:<mygroup> *

Donde myuser y mygroup fuera de curso deben reemplazarse con la configuración adecuada para su sistema. prueba git: git o gituser: gituser o alguna otra cosa que te guste.

usuario2581924
fuente
1

Verifique el repositorio: $ git remote -v

origin  ssh://[email protected]:2283/srv/git/repo.git (fetch)
origin  ssh://[email protected]:2283/srv/git/repo.git (push)

Tenga en cuenta que aquí hay una subcadena 'git @', indica a git que se autentique como nombre de usuario 'git' en el servidor remoto. Si omite esta línea, git se autenticará con un nombre de usuario diferente, por lo tanto, se producirá este error.

Sergey
fuente
1

En mi caso, no había autenticación unificada (por ejemplo, dentro del dominio + servicio similar a AD) entre mi máquina y el servidor virtual git. Por lo tanto, los usuarios y el grupo de git son locales para el servidor virtual. En mi caso, mi usuario remoto (que uso para iniciar sesión en el servidor remoto) simplemente no se agregó al grupo git remoto.

ssh root@<remote_git_server>
usermod -G <remote_git_group> <your_remote_user>

Después de eso, verifique los permisos como se describe en las publicaciones anteriores ...

Vitaly Isaev
fuente
1

¿Has probado sudo git push -u origin --all ? A veces es lo único que necesita para evitar este problema. Le pide la contraseña del sistema de administración, la que puede iniciar sesión en su máquina, y eso es lo que necesita presionar, o confirmar, si es el caso.

Filipe Fernandes
fuente