2010-04-15 36 views
47

Tengo un problema extraño que no puedo resolver. Esto es lo que sucedió:Error de Git: no se puede agregar a .git/logs/refs/remotes/origin/master: Permiso denegado

Tenía algunos archivos de registro en un repositorio de Github que no quería allí. He encontrado este script que elimina completamente los archivos de la historia 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 
[email protected] 
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, hizo una primera copia de seguridad y luego lo intentó. Parecía funcionar bien. Entonces hice un git push -f y nos recibieron 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'. 

todo parece haber empujado muy bien sin embargo, debido a que los archivos parecen haber desaparecido desde el repositorio GitHub, si lo intento y empujar otra vez conseguir 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 durante toda la noche y fui a cometer mis cambios:

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

Así que:

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

trato al comprometerse de nuevo y me sale:

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

Entonces yo:

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

Y luego Intento el commit nuevamente:

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 

Hooray. Salto en http://GitHub.com y reviso el repositorio, y mi último compromiso no está donde se encuentra. :: scratch head :: Así que presiono de nuevo:

Everything up-to-date 

Umm ... no se ve así. Nunca he tenido este problema antes, ¿podría ser un problema con github? ¿O estropeé algo con mi proyecto de git?

EDITAR

No importa, lo hice un simple:

git push origin master 

y empujó bien.

Respuesta

121

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

Fije la propiedad de los archivos, y que debe estar bien:

# run this from the root of the git working tree 
sudo chown -R "${USER:-$(id -un)}" . 
+0

Ese comando funcionó para mí. Lo ejecuté desde la raíz del clon. Gracias @CharlesDuffy! – ariestav

+2

@ Mr.Stranger, solo si tiene un valor y nombre de usuario de IFS correctos (pueden aparecer nombres de usuario con espacios, por ejemplo en cygwin). Más seguro para citar: 'sudo chown -R" $ USER ".', y no asumir cordura. :) –

+0

@ Mr.Stranger, ... también, 'USER' no está garantizado por http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_03, por lo que podría ser más seguro usar '" $ (id -un) "'. –

-7

Por favor, primero dar los permisos de root cuenta, como a continuación

chmod -R 777 foldername 

después de que ejecute el comando commit

+5

Esto es extremadamente peligroso: da acceso a sus archivos a cualquier cuenta del sistema, incluido un daemon comprometido con privilegios "nobody". Los daemons del sistema usan "nadie" (u otras cuentas no privilegiadas) para componentes sensibles a la seguridad * porque * la cuenta de nadie no debe poder hacer nada demasiado arriesgado, incluso si está comprometida. Al permitir que todos los usuarios, incluso nadie, tengan acceso de escritura a sus archivos, está haciendo que las medidas de seguridad esenciales sean inútiles. –

+1

Si por alguna razón desea que sus archivos sean propiedad de root y puedan ser escritos por un usuario no root específico, la forma segura de hacerlo (en un sistema donde cada usuario tiene su propio grupo, como es práctica habitual) es ' chown -R root: user directory', y luego 'chmod -R 775 directory' (o' 770', si otras cuentas tampoco necesitan acceso de lectura). –

+1

@JasonGlisson, algo que "funciona" solo creando enormes agujeros de seguridad es probablemente algo que estaría mejor si se rompiera. –

1

En Mi caso Creé los archivos con permisos de raíz localmente e intenté enviar el código a remoto con permisos locales. Así que ejecuté este comando

$find . -user root 

para averiguar qué todos los archivos tienen "raíz" como propietario. Y luego he cambiado propietario para todos los archivos que se encuentran en la raíz a la utilización de locales siguientes comandos

$sudo chown parineethat `find . -user root` 

entonces yo era capaz de empujar mi código de local a remoto.

+0

'' 'sudo chown parineethat' find. -user root' '' 'no es confiable, no funcionará correctamente con los nombres de archivo con espacios. En cambio, 'sudo find. -user root -exec chown parineethat {} + '. Ver [BashPitfalls # 1] (http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29) para una discusión relevante. –

0

Vamos a concentrarnos en lo que se queja de exactamente:

Permission denied error: Cannot update the ref 'refs/remotes/origin/master'.

Antes de hacer cambios mod/propiedad recursivas, travesía de camino a ese archivo y corregir los permisos que son incorrectos.

Creo que causé este problema al crear una rama mientras estaba en la raíz y luego tratar de meterme con esa rama como mi usuario.

Cuestiones relacionadas