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.