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?

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 ...


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


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.


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


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]

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.


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.


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.



2
sudo chown -R $USER:$USER .

Fiz o trabalho para mim.


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


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.


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


é 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.