Erro de envio do Git: não é possível desvincular o antigo (permissão negada)

190

No servidor remoto, tenho um gancho pós-recebimento configurado para fazer um check-out git do meu repositório:

#!/bin/sh
GIT_WORK_TREE=/var/www/<website> git checkout -f

Mas quando faço o envio da minha máquina local para o repositório git no servidor, recebo as seguintes mensagens de erro:

remote: error: unable to unlink old '<file>' (Permission denied)

Isso aparece várias vezes, uma mensagem de erro para quase todos os arquivos.

No entanto, eu tenho um arquivo README.txt que eu posso alterar usando o git, aqui estão suas permissões:

-rw-r--r--  1 <serverusername>  <serverusername>  2939 Aug  2 10:58 README.txt

Mas outros arquivos com exatamente o mesmo proprietário e as mesmas permissões me dão esse erro.

Em outro repositório local para outro site, tenho os arquivos com o nome de usuário da minha máquina local como proprietário e, quando envio ao servidor remoto, ele respeita o proprietário dos arquivos e funciona como um encanto.

Obviamente, parece um erro relacionado a permissões, mas não consigo encontrar uma maneira de corrigi-lo, alguma sugestão?

rfc1484
fonte

Respostas:

335

Quando você precisa desvincular o arquivo, precisa ter a permissão 'w' para o diretório, em que arquivo está, não para o arquivo ...

Jan Marek
fonte
65
Na verdade, esse era o problema, eu o corrigi usando sudo chmod -R g+was pastas culpadas.
Rfc1484
1
OMG obrigado. Estava tão irritado com as permissões de pensamento que estavam corretas no arquivo. Faz sentido que as atualizações sejam realmente mais como mvações do que apenas sobrescritas.
Doublejsh 24/11
1
Alterar as permissões de dir funcionou para mim (obrigado!), Mas é estranho, porque eu poderia sobrescrever manualmente os arquivos em questão via sftp sem nenhum problema. Estranho que, quando o git tentasse fazer o mesmo, não pudesse.
23613 Jonathan Stark
1
Lembre-se também de que, se você ainda tiver o arquivo aberto, esse erro também será exibido. Tinha o mesmo erro e foi por isso que eu não era capaz de empurrar as minhas alterações no.
Matias
1
O primeiro caractere da ls -lexibição indica o tipo de arquivo e não está relacionado às permissões. Os nove caracteres restantes estão em três conjuntos, cada um representando uma classe de permissões como três caracteres. O primeiro conjunto representa a classe de usuário. O segundo conjunto representa a classe do grupo. O terceiro conjunto representa a outra classe. O g+wno chmod dá o conjunto grupo (o gparâmetro) permissão para escrever (o wparâmetro)
rfc1484
67
sudo chmod -R ug+w .;

Este comando resolveria o problema. Dá permissões de gravação para a pasta.

Rajendra kumar Vankadari
fonte
41

Se você estiver usando algum IDE, provavelmente o problema é que esse arquivo foi usado por algum processo. Como seu tomcat pode estar usando o arquivo Tente identificar esse processo específico e fechá-lo. Isso deve resolver o seu problema.

Rama Krishna Gollapudi
fonte
12

Eu tive o mesmo problema e nenhuma das soluções acima funcionou para mim. Eu apaguei a pasta incorreta. Então:

git reset --hard

Excluiu todos os arquivos remanescentes para limpar o status do git e, em seguida, fez:

git pull

Finalmente funcionou.

NOTA: Se a pasta era, por exemplo, uma pasta pública com arquivos de construção, lembre-se de reconstruir os arquivos

wcyn
fonte
Obrigado, nada mais estava funcionando para mim também, excluí-lo parecia ser a única opção.
math0ne
No meu caso, essa pasta ofender é .git
Tushar Kathuria
11

Eu acho que o problema pode estar na propriedade da pasta, então defina-a como a propriedade do usuário atual

sudo chown -R your_login_name /path/to/folder
Você pode encontrar a solução [aqui] [1]
Soumitra Sarkar
fonte
7

FWIW - Eu tive um problema semelhante e não tenho certeza se isso o aliviou (além do mod de permissão): Fechando o Eclipse que estava usando a ramificação com esse problema.

cellepo
fonte
Da mesma forma, recebi esse erro quando um arquivo CSV controlado por versão foi aberto no Excel. Simplesmente fechar o Excel resolveu isso. Provavelmente isso também ocorre com outros aplicativos no Windows e provavelmente depende de como o programa marca o arquivo como aberto durante a edição.
Carel
3

Esta é uma pergunta antiga, mas isso pode ajudar os usuários de Mac.

Se você estiver copiando arquivos do Time Machine manualmente, em vez de restaurá-los pelo Time Machine, ele adicionará ACLs a tudo, o que pode prejudicar suas permissões.

Por exemplo, a seção deste artigo que diz "Como corrigir permissões de arquivo do Mac OS X" mostra que "todos" têm permissões personalizadas, o que estraga tudo:

Permissões incorretas, de http://dreamlight.com/how-to-fix-mac-os-x-file-permissions

Você precisa remover as ACLs desses diretórios / arquivos. Esta resposta do Superusuário entra nele, mas aqui está o comando:

sudo chmod -RN .

Depois, verifique se os diretórios e arquivos têm as permissões adequadas. Eu uso 750para diretórios e 644arquivos.

kylesimmonds
fonte
2

Eu recebo esse erro e outros erros estranhos do git quando tenho um servidor em execução (no Intellij). Parar o servidor e tentar novamente o comando git freqüentemente o corrige.

Phil Carter
fonte
2
git reset --hard

Trabalhou para mim

kreker
fonte
4
Isso pode ser um pouco extremo, pois faz muito mais.
Cdaddr 15/03/19
2
sudo chown -R $USER:$USER .

Fiz o trabalho para mim.

BARJ
fonte
1

Alguns arquivos estão protegidos contra gravação que nem o git pode gravá-lo. Altere a permissão da pasta para permitir a gravação, por exemplo, sudo chmod 775 foldername

E então git pull novamente

Carmela
fonte
0

Lembre-se também de verificar a permissão do próprio diretório raiz!

Você pode encontrar:

drwxr-xr-x  9 not-you www-data  4096 Aug  8 16:36 ./
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 README.txt
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 UPDATE.txt

e o erro 'permissão negada' será exibido.

cadáver
fonte
0

Puxar pode ter criado alterações locais.

Adicione seu arquivo não rastreado:

git add.

Stash changes.

esconderijo

Solte as alterações locais.

gota de esconderijo git

Puxe com permissão sudo

sudo git pull ramificação remota

user2858738
fonte
é tudo sobre a permissão dos arquivos locais não há nada a ver com git acabo de comando executados com sudo e funcionou por isso não exigir que todos estes passos
raviramani