Error de Git: no se puede agregar a .git / logs / refs / remotes / origin / master: Permiso denegado

87

Tengo un problema extraño que parece que no puedo resolver. Esto es lo que sucedió:

Tenía algunos archivos de registro en un repositorio de github que no quería allí. Encontré este script que elimina archivos completamente del historial de git así:

    #!/bin/bash
set -o errexit

# Author: David Underhill
# Script to permanently delete files/folders from your git repository.  To use 
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2

if [ $# -eq 0 ]; then
    exit 0are still
fi

# make sure we're at the root of git repo
if [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1
fi

# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD

# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune

Yo, por supuesto, primero hice una copia de seguridad y luego la probé. Parecía funcionar bien. Luego hice un git push -f y fui recibido con los siguientes mensajes:

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
error: Cannot update the ref 'refs/remotes/origin/master'.

Sin embargo, todo parece haber funcionado bien, porque los archivos parecen haber desaparecido del repositorio de GitHub, si intento presionar nuevamente, obtengo lo mismo:

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
error: Cannot update the ref 'refs/remotes/origin/master'.
Everything up-to-date

EDITAR

$ sudo chgrp {user} .git/logs/refs/remotes/origin/master
$ sudo chown {user} .git/logs/refs/remotes/origin/master
$ git push
Everything up-to-date

¡Gracias!

EDITAR

UH oh. Problema. He estado trabajando en este proyecto toda la noche y solo fui a confirmar mis cambios:

error: Unable to append to .git/logs/refs/heads/master: Permission denied
fatal: cannot update HEAD ref

Asique:

sudo chown {user} .git/logs/refs/heads/master
sudo chgrp {user} .git/logs/refs/heads/master

Intento el compromiso de nuevo y obtengo:

error: Unable to append to .git/logs/HEAD: Permission denied
fatal: cannot update HEAD ref

Asique:

sudo chown {user} .git/logs/HEAD
sudo chgrp {user} .git/logs/HEAD

Y luego intento el compromiso de nuevo:

16 files changed, 499 insertions(+), 284 deletions(-)
create mode 100644 logs/DBerrors.xsl
delete mode 100644 logs/emptyPHPerrors.php
create mode 100644 logs/trimXMLerrors.php
rewrite public/codeCore/Classes/php/DatabaseConnection.php (77%)
create mode 100644 public/codeSite/php/init.php
$ git push
Counting objects: 49, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (27/27), done.
Writing objects: 100% (27/27), 7.72 KiB, done.
Total 27 (delta 15), reused 0 (delta 0)
To [email protected]:IAmCorbin/MooKit.git
59da24e..68b6397  master -> master

¡Hurra! Salto a http://GitHub.com y reviso el repositorio, y mi última confirmación no está en ningún lugar. :: scratch head :: Así que presiono de nuevo:

Everything up-to-date

Umm ... no lo parece. Nunca antes había tenido este problema, ¿podría ser un problema con github? ¿O arruiné algo con mi proyecto git?

EDITAR

No importa, hice un simple:

git push origin master

y empujó bien.

Corbin Tarrant
fuente

Respuestas:

216

Parece que ejecutó git como root localmente, cambiando así la propiedad de algunos de los archivos que rastrean la ubicación de la originrama.

Arregle la propiedad del archivo, y debería estar bien:

# run this from the root of the git working tree
sudo chown -R "${USER:-$(id -un)}" .
Charles Duffy
fuente
1
Ese comando funcionó para mí. Lo ejecuté desde la raíz del clon. ¡Gracias @CharlesDuffy!
ariestav
4
@ Sr. Extraño, solo si tiene un valor IFS y un nombre de usuario cuerdos (los nombres de usuario con espacios pueden ocurrir, por ejemplo, en cygwin). Es más seguro citar: sudo chown -R "$USER" .y no asumir cordura. :)
Charles Duffy
@ Mr.Stranger, ... también, USERno está garantizado por pubs.opengroup.org/onlinepubs/009695399/utilities/… , por lo que podría ser más seguro de usar "$(id -un)".
Charles Duffy
Dice mi usuario is not in the sudoers file. This incident will be reported.: ¿algún consejo sobre lo que puedo hacer? Gracias.
giovannipds
1
La sintaxis anterior es la expansión de parámetros ; "${var:-default}"se expande al valor de la variable "$var", a menos que ese valor esté vacío o no establecido, en cuyo caso se resuelve en default. Por lo tanto, expandimos "$USER"o la salida generada al ejecutar id -un.
Charles Duffy
4

Concentrémonos en lo que se está quejando exactamente:

Error de permiso denegado: no se puede actualizar la referencia 'refs / remotes / origin / master'.

Antes de realizar cambios recursivos de modificación / propiedad, diríjase a ese archivo y corrija los permisos incorrectos.

Creo que causé este problema al crear una rama mientras era root y luego intenté meterme con esa rama como mi usuario.

Andrew E
fuente
3
¿Es realmente una mejora arreglar los archivos que son propiedad de cualquier persona que no sea el usuario que se espera que posea todo el árbol de origen, uno por uno?
Charles Duffy
2

En mi caso, creé los archivos con permiso de root localmente e intenté enviar el código a control remoto con permisos locales. Entonces ejecuté este comando

$find . -user root

para averiguar qué archivos tienen "root" como propietario. Y luego cambié el propietario de todos los archivos que están bajo root a local usando el siguiente comando

$sudo chown parineethat `find . -user root`

Luego pude enviar mi código de local a remoto.

Parineetha
fuente
sudo chown parineethat `find . -user root` no es confiable: no funcionará bien con nombres de archivo con espacios. En su lugar, sudo find . -user root -exec chown parineethat {} +. Consulte BashPitfalls # 1 para una discusión relevante.
Charles Duffy
1

Esto cambiará todos sus archivos y directorios .git de forma recursiva (de raíz a 1000) y le dará una lista completa de todos los cambios realizados en la terminal.

sudo chown -Rc $ UID .git /

Donald L. Wilson
fuente
0

Intenté arreglar la propiedad de Git, pero todavía no funciona.

Pero logré solucionarlo creando la rama local con un nombre diferente y eliminándola.

Luego, reviso el mismo nombre de rama nuevamente y funciona.

TLDR;

No puedo pagar 'staging / rc'.

Entonces, realizo el pago usando en su staginglugar que el control remoto apunta a 'staging / rc'.

Y lo elimino y vuelvo a pagar. Pero, esta vez lo uso staging/rccomo mi nombre de sucursal local.

Funciona y no tengo ni idea de por qué.

Morgan Koh
fuente
-16

Primero otorgue los permisos de la rootcuenta como a continuación

chmod -R 777 foldername

después de eso, ejecute el comando de confirmación

Viru
fuente
7
Esto es extremadamente peligroso: da acceso de escritura a sus archivos a cualquier cuenta del sistema, incluido un demonio comprometido con privilegios de "nadie". Los demonios del sistema usan "nadie" (u otras cuentas sin privilegios) para componentes sensibles a la seguridad porque se supone que la cuenta de nadie puede hacer nada demasiado arriesgado incluso si está comprometida. Al permitir que todos los usuarios, incluso nadie, tengan acceso de escritura a sus archivos, hace inútiles las medidas de seguridad esenciales.
Charles Duffy
1
Si por alguna razón desea que sus archivos sean propiedad de root y que un usuario no root específico pueda escribirlos, la forma segura de hacerlo (en un sistema donde cada usuario tiene su propio grupo, como es práctica estándar) es chown -R root:user directory, y entonces chmod -R 775 directory(o 770, si otras cuentas tampoco necesitan acceso de lectura).
Charles Duffy
1
@JasonGlisson, algo que "funciona" solo creando agujeros de seguridad masivos es probablemente algo que sería mejor si no funcionara.
Charles Duffy
1
@JasonGlisson, en la medida en que brindamos asesoramiento tanto a una comunidad como a esta, como miembro de esa comunidad, el tipo y la calidad de asesoramiento que brindamos es asunto mío tanto como de cualquier otra persona y, como alguien que trabaja en seguridad , Estoy en una buena posición para comentar sobre el tema. Ver comentario inicial, re: impacto.
Charles Duffy
1
@JasonGlisson, ... en cuanto a por qué mi consejo no funcionó para usted, necesitaría ver los detalles: un registro de los comandos ejecutados, en orden, con un mensaje que muestra el directorio de trabajo actual antes de cada uno; texto de los errores emitidos; etc - para comentar; pero el lugar para esa discusión se adjuntará a la respuesta para la que informas malos resultados, a diferencia de aquí.
Charles Duffy