Erro Git: não é possível anexar a .git / logs / refs / remotes / origin / master: permissão negada

87

Estou tendo um problema estranho que não consigo resolver. Aqui está o que aconteceu:

Eu tinha alguns arquivos de log em um repositório github que não queria lá. Encontrei este script que remove arquivos completamente do histórico do git assim:

    #!/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

É claro que primeiro fiz um backup e depois tentei. parecia funcionar bem. Em seguida, executei um git push -f e fui recebido com as seguintes mensagens:

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

Tudo parece ter funcionado bem, porque os arquivos parecem ter sumido do repositório do GitHub, se eu tentar empurrar novamente, obtenho a mesma coisa:

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

Obrigado!

EDITAR

Uh Oh. Problema. Estive trabalhando neste projeto a noite toda e só fui confirmar minhas alterações:

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

Então eu:

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

Eu tento o commit novamente e obtenho:

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

Então eu:

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

E então eu tento o commit novamente:

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. Eu pulo em http://GitHub.com e verifico o repositório, e meu último commit não está onde posso ser encontrado. :: coçar a cabeça :: Então eu empurro novamente:

Everything up-to-date

Umm ... não parece. Nunca tive esse problema antes, pode ser um problema com o github? ou eu baguncei alguma coisa com meu projeto git?

EDITAR

Esqueça, eu fiz um simples:

git push origin master

e funcionou bem.

Corbin Tarrant
fonte

Respostas:

216

Parece que você executou git como root localmente, alterando assim a propriedade de alguns dos arquivos que rastreiam a localização do originbranch.

Corrija a propriedade do arquivo e você ficará bem:

# run this from the root of the git working tree
sudo chown -R "${USER:-$(id -un)}" .
Charles Duffy
fonte
1
Esse comando funcionou para mim. Corri da raiz do clone. Obrigado @CharlesDuffy!
ariestav
4
@ Mr.Stranger, somente se você tiver um valor IFS e nome de usuário lógicos (nomes de usuário com espaços podem acontecer, por exemplo no cygwin) Mais seguro citar: sudo chown -R "$USER" .e não presumir sanidade. :)
Charles Duffy
@ Mr.Stranger, ... também, USERnão é garantido por pubs.opengroup.org/onlinepubs/009695399/utilities/… , então pode ser mais seguro usar "$(id -un)".
Charles Duffy
Diz meu usuário is not in the sudoers file. This incident will be reported.- alguma dica sobre o que posso fazer? Obrigado.
giovannipds
1
A sintaxe acima é a expansão do parâmetro ; "${var:-default}"expande-se para o valor da variável "$var", a menos que esse valor esteja vazio ou não definido, caso em que é resolvido para default. Assim, podemos expandir para "$USER"ou a saída gerada pela execução id -un.
Charles Duffy
4

Vamos nos concentrar exatamente no que está reclamando:

Erro de permissão negada: Não é possível atualizar a referência 'refs / remotes / origin / master'.

Antes de fazer alterações recursivas de mod / propriedade, vá até aquele arquivo e corrija as permissões que estão incorretas.

Acho que causei esse problema criando um branch enquanto era root e, em seguida, tentando mexer com esse branch como meu usuário.

Andrew E
fonte
3
É realmente uma melhoria consertar os arquivos que pertencem a qualquer pessoa que não seja o usuário que esperava possuir toda a árvore de origem, um por um?
Charles Duffy
2

No meu caso, criei os arquivos com permissão de root localmente e tentei enviar o código para o remoto com permissões locais. Então eu executei este comando

$find . -user root

para descobrir o que todos os arquivos têm "root" como proprietário. E então mudei o proprietário de todos os arquivos que estão sob root para locais usando o seguinte comando

$sudo chown parineethat `find . -user root`

Então, consegui enviar meu código de local para remoto.

Parineetha
fonte
sudo chown parineethat `find . -user root` não é confiável - não funciona bem com nomes de arquivos com espaços. Em vez disso, sudo find . -user root -exec chown parineethat {} +. Veja BashPitfalls # 1 para uma discussão relevante.
Charles Duffy,
1

Isso mudará todos os seus arquivos .git e diretórios recursivamente (de raiz a 1000) e fornecerá uma lista completa de todas as mudanças feitas no terminal.

sudo chown -Rc $ UID .git /

Donald L Wilson
fonte
0

Tentei consertar a propriedade do Git, mas ainda não funciona.

Mas consegui consertar criando a filial local com um nome diferente e excluindo-a.

Então, eu verifico o mesmo nome de branch novamente e funciona.

TLDR;

Não consigo verificar `staging / rc '.

Então, eu verifico usando, em stagingvez disso, que o remoto está apontando para `staging / rc '.

E, eu excluo e checkout novamente. Mas, desta vez, uso staging/rccomo meu nome de filial local.

Funciona e não tenho ideia do porquê.

Morgan Koh
fonte
-16

Por favor, primeiro dê as permissões da rootconta como abaixo

chmod -R 777 foldername

depois disso, execute o comando commit

Viru
fonte
7
Isso é extremamente perigoso - dá a qualquer conta no sistema, incluindo um daemon comprometido com apenas privilégios de "ninguém", acesso de gravação aos seus arquivos. Os daemons do sistema usam "nobody" (ou outras contas sem privilégios) para componentes sensíveis à segurança porque a conta nobody não é capaz de fazer nada muito arriscado, mesmo se estiver comprometido. Ao permitir que todos os usuários, mesmo ninguém, tenham acesso de gravação aos seus arquivos, você está tornando as medidas de segurança essenciais inúteis.
Charles Duffy
1
Se por algum motivo você quiser que seus arquivos sejam de propriedade do root e graváveis ​​por um usuário não root específico, a maneira segura de fazer isso (em um sistema onde cada usuário tem seu próprio grupo, como é a prática padrão) é chown -R root:user directory, e então chmod -R 775 directory(ou 770, se outras contas também não precisarem de acesso de leitura).
Charles Duffy
1
@JasonGlisson, algo que "funciona" apenas criando enormes falhas de segurança é provavelmente algo que seria melhor permanecer quebrado.
Charles Duffy
1
@JasonGlisson, na medida em que estamos prestando consultoria como e para uma comunidade, como um membro dessa comunidade, o tipo e a qualidade dos conselhos que oferecemos são da minha conta tanto quanto de qualquer outra pessoa - e, como alguém que trabalha com segurança , Estou bem posicionado para comentar sobre o assunto. Veja o comentário inicial, re: impacto.
Charles Duffy,
1
@JasonGlisson, ... quanto a por que meu conselho não funcionou para você, eu precisaria ver os detalhes - um log dos comandos executados, em ordem, com um prompt mostrando o diretório de trabalho atual antes de cada um; texto de quaisquer erros emitidos; etc - para comentar; mas o lugar para essa discussão seria anexado à resposta para a qual você está relatando resultados ruins, ao contrário de aqui.
Charles Duffy,