Git Push Error: permissão insuficiente para adicionar um objeto ao repositório de banco de dados

591

Quando tento enviar para um controle remoto compartilhado do git, recebo o seguinte erro: insufficient permission for adding an object to repository database

Então li sobre uma correção aqui: Fix Isso funcionou para o próximo push, já que todos os arquivos estavam no grupo correto, mas na próxima vez que alguém pressionou uma alteração, ele criou um novo item na pasta de objetos que tinha o grupo padrão como o grupo. A única coisa em que consigo pensar é alterar todo o grupo padrão do desenvolvedor para itens que eles fazem check-in, mas isso parece um hack. Alguma ideia? Obrigado.

skaz
fonte
Eu recebi esse erro após acidentalmente git adde git commit-ing como usuário root. Corrigi-o com uma git resetresposta e esta pergunta para corrigir as .gitpermissões de diretório.
StockB
Como posso descobrir qual objeto ele estava tentando criar (ao depurar manualmente esses problemas de permissão)? A mensagem de erro é muito vaga.
mirabilos
Eu recebi esse erro ao copiar e colar outro arquivo .git usando o sudo. portanto, os arquivos tinham sudo sudo como nome e grupo.
Vincent

Respostas:

864

Permissões de reparo

Depois de identificar e corrigir a causa subjacente (veja abaixo), convém reparar as permissões:

cd /path/to/repo.git
sudo chgrp -R groupname .
sudo chmod -R g+rwX .
find . -type d -exec chmod g+s '{}' +

Observe que se você quiser que todos possam modificar o repositório, você não precisa do chgrpe deseja alterar o chmod parasudo chmod -R a+rwX .

Se você não corrigir a causa subjacente, o erro continuará voltando e você precisará continuar executando os comandos acima repetidamente.

Causas subjacentes

O erro pode ser causado por um dos seguintes:

  • O repositório não está configurado para ser um repositório compartilhado (veja core.sharedRepositoryem git help config). Se a saída de:

    git config core.sharedRepository
    

    não é groupou trueou 1ou alguma máscara, tente executar:

    git config core.sharedRepository group
    

    e execute novamente o recursivo chmode chgrp(consulte "Permissões de reparo" acima).

  • O sistema operacional não interpreta um bit setgid nos diretórios como "todos os novos arquivos e subdiretórios devem herdar o proprietário do grupo".

    Quando core.sharedRepositoryé trueou group, o Git conta com um recurso dos sistemas operacionais GNU (por exemplo, toda distribuição Linux) para garantir que os subdiretórios recém-criados sejam de propriedade do grupo correto (o grupo em que todos os usuários do repositório estão). Esse recurso está documentado na documentação do coreUtil GNU :

    ... [Se] o bit de ID do grupo de conjunto de um diretório estiver definido, os subarquivos recém-criados herdarão o mesmo grupo que o diretório e os subdiretórios recém-criados herdarão o bit de ID do grupo de conjuntos do diretório pai. ... [Esse mecanismo permite] que os usuários compartilhem arquivos com mais facilidade, diminuindo a necessidade de usar chmodou chowncompartilhar novos arquivos.

    No entanto, nem todos os sistemas operacionais possuem esse recurso (o NetBSD é um exemplo). Para esses sistemas operacionais, verifique se todos os usuários do Git têm o mesmo grupo padrão. Como alternativa, você pode tornar o repositório gravável em todo o mundo executando git config core.sharedRepository world(mas tenha cuidado - isso é menos seguro).

  • O sistema de arquivos não suporta o bit setgid (por exemplo, FAT). ext2, ext3, ext4 suportam o bit setgid. Até onde eu sei, os sistemas de arquivos que não suportam o bit setgid também não suportam o conceito de propriedade de grupo, portanto todos os arquivos e diretórios pertencerão ao mesmo grupo de qualquer maneira (qual grupo é uma opção de montagem). Nesse caso, verifique se todos os usuários do Git estão no grupo que possui todos os arquivos no sistema de arquivos.
  • Nem todos os usuários do Git estão no mesmo grupo que possui os diretórios do repositório. Verifique se o proprietário do grupo nos diretórios está correto e se todos os usuários estão nesse grupo.
Richard Hansen
fonte
1
@ Richard Hansen - eu realmente não sei o que você quer dizer com forçar a propriedade. Estou procurando o chmod para o homem, mas não sei o suficiente sobre isso para que as palavras façam sentido :) Alguma dica?
skaz
7
@ Gi: Você não terá nada se não estiver definido (o mesmo que falseou umask). Veja git help configpara mais detalhes.
Richard Hansen
10
Eu devo ter emitido git pushusando a conta root no meu diretório de trabalho. Eu descobri que o proprietário de alguns arquivos do repositório git é root ( -r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424) de acordo com esta resposta.
LiuYan
3
@MattBrowne: Observe que é uma capital X, não uma minúscula x. Uma maiúscula Xsignifica "definir S_IXGRPse o arquivo é um diretório (ou se outro S_IX*bit estiver definido)", para que não torne todos os arquivos executáveis. Pode ser desnecessário, mas talvez não, se core.sharedRepositoryfoi definido 0600em algum momento no passado.
Richard Hansen
2
@ francoisromain: Essa linha define o bit setgid em todos os diretórios. Veja gnu.org/software/coreutils/manual/html_node/…
Richard Hansen
440

Para Ubuntu (ou qualquer Linux)

Da raiz do projeto,

cd .git/objects
ls -al
sudo chown -R yourname:yourgroup *

Você pode dizer qual deve ser seu nome e seu grupo observando as permissões na maioria da saída desse comando ls -al

Nota: lembre-se da estrela no final da linha sudo

TerryS
fonte
7
Trabalhou muito bem! Sim, por algum motivo, algumas pastas receberam um nome e grupo diferentes (raiz).
Peter Arandorenko
2
Eu recebo:Sorry, user myuser is not allowed to execute '/bin/chown
Francisco Corrales Morales
O *fez toda a diferença. Obrigado.
Bradley Flood
5
Meu problema foi que eu tinha feito uma vez um "git pull" como root, o que eu acho que estraguei as permissões ... você pode verificar fazendo umls .git
rogerdpack
Obrigado por uma solução rápida!
helvete
74

use o seguinte comando, funciona como mágica

sudo chown -R "${USER:-$(id -un)}" .

digite o comando exatamente como é (com espaços extras e um ponto no final)

Code_Worm
fonte
6
Funciona como um encanto!
Doncadavona 12/12
1
impressionante! funcionou perfeitamente no meu mac
Sachin Khot
Isso me ajudou também! Obrigado.
Horvath Adam
De fato, funcionou como mágica! Obrigado!
Kumar Manish
49

sudo chmod -R ug+w .;

Basicamente, o .git/objectsarquivo não tem permissões de gravação. A linha acima concede permissão para todos os arquivos e pastas no diretório.

Rajendra kumar Vankadari
fonte
2
Isto é o que funcionou para mim. A resposta aceita infelizmente não. Graças à Rajendra!
revelt
27

Eu só queria adicionar minha solução. Tive um repo no OS X que possuía a propriedade root em alguns diretórios e o Home (que é o meu diretório de usuários) em outros que causaram o mesmo erro listado acima.

A solução foi simples, felizmente. Do terminal:

sudo chown -R Home projectdirectory
Brandon
fonte
A mesma coisa aconteceu comigo. Não consigo descobrir como alguns dos objetos obtiveram a propriedade da raiz, mas conseguiram.
vy32
18

Uma boa maneira de depurar isso é a próxima vez que isso acontecer, SSH no repositório remoto, cd na pasta de objetos e faça um ls -al.

Se você vir 2-3 arquivos com usuário diferente: propriedade do grupo, esse é o problema.

Isso aconteceu comigo no passado com alguns scripts herdados acessando nosso repositório git e geralmente significa que um usuário (unix) empurrou / modificou arquivos pela última vez e seu usuário não tem permissão para sobrescrever esses arquivos. Você deve criar um grupo git compartilhado no qual todos os usuários habilitados para git estejam e, em seguida, recursivamente chgrpa objectspasta e seu conteúdo, para que a propriedade do grupo seja o gitgrupo compartilhado .

Você também deve adicionar um pedaço fixo na pasta para que todos os arquivos criados na pasta sempre tenham o grupo de git.

nome do diretório chmod g + s

Atualização: eu não sabia sobre o core.sharedRepository. É bom saber, embora provavelmente faça o que precede.

Mauvis Ledford
fonte
15

Resolvido para mim ... apenas isso:

sudo chmod 777 -R .git/objects
GUSTAVO BERBERT
fonte
21
Chmod 777não é recomendado, uma vez que expõe todo o seu arquivo para o resto do mundo fazer sua máquina vulnerável
Elena
23
Se o seu conselho for chmod 777, 99 em 100 vezes você não entende o problema e é provável que cause mais problemas do que ajuda a resolver. Como mostra a resposta aceita acima, esse problema não é diferente.
jonatan
Por que vocês não propõem uma resposta aceitável e dizem que essa é uma escolha errada?
Giovani
2
Porque, embora existam respostas aceitáveis ​​na página, essa resposta inaceitável ainda está aqui.
Teh JoE
sudo chmod -R 777 .git / objects
Nabeel Ahmed
9

Isso pode acontecer facilmente se você executou git initum usuário diferente daquele que planeja usar ao enviar alterações.

Se você seguir cegamente as instruções em [1], isso acontecerá, pois você provavelmente criou o usuário do git como root e depois passou imediatamente para o git init sem alterar o usuário no meio.

[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server

Gitzor
fonte
7

Linux, macOS:

cd .git/
sudo chown -R name:group *

onde nameé o seu nome de usuário e groupo grupo ao qual ele pertence.

Afshin Mehrabani
fonte
5

Depois de adicionar algumas coisas ... confirme-as e, depois de tudo terminado, empurre! BANG !! Inicie todos os problemas ... Como você deve notar, existem algumas diferenças na maneira como os projetos novos e os existentes foram definidos. Se outra pessoa tentar adicionar / confirmar / enviar os mesmos arquivos ou conteúdo (o git mantém os dois mesmos objetos), enfrentaremos o seguinte erro:

$ git push
Counting objects: 31, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (21/21), 2.07 KiB | 0 bytes/s, done.
Total 21 (delta 12), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects  remote: fatal: failed to write object

Para resolver esse problema, é necessário ter em mente o sistema de permissões do sistema operacional, pois neste caso você é restringido por ele. Você entende melhor o problema, vá em frente e verifique a pasta do seu objeto git (.git / objects). Você provavelmente verá algo assim:

<your user_name>@<the machine name> objects]$ ls -la
total 200
drwxr-xr-x 25 <your user_name> <group_name> 2048 Feb 10 09:28 .
drwxr-xr-x  3 <his user_name> <group_name> 1024 Feb  3 15:06 ..
drwxr-xr-x  2 <his user_name> <group_name> 1024 Jan 31 13:39 02
drwxr-xr-x  2 <his user_name> <group_name> 1024 Feb  3 13:24 08

* Observe que as permissões desse arquivo foram concedidas apenas para seus usuários, ninguém nunca poderá alterá-lo ... *

Level       u   g   o
Permission rwx r-x ---
Binary     111 101 000
Octal       7   5   0

RESOLVER O PROBLEMA

Se você tiver permissão de superusuário, poderá avançar e alterar todas as permissões usando a etapa dois; em qualquer outro caso, você precisará solicitar a todos os usuários com objetos criados com seus usuários, use o comando a seguir para saber quem eles são :

$ ls -la | awk '{print $3}' | sort -u 
<your user_name>
<his user_name>

Agora você e todos os usuários proprietários do arquivo terão que alterar a permissão desses arquivos, fazendo:

$ chmod -R 774 .

Depois disso, você precisará adicionar uma nova propriedade equivalente a --shared = group feita para o novo repositório, de acordo com a documentação, tornando o repositório gravável em grupo, faça-o executando:

$ git config core.sharedRepository group

https://coderwall.com/p/8b3ksg

helmedeiros
fonte
Eu tinha o mesmo username:groupnamepara o meu, mas quando tentei chmod -R 774 ., poderia executar com git add --allêxito.
John Skilbeck
3

Para o meu caso, nenhuma das sugestões funcionou. Estou no Windows e isso funcionou para mim:

  • Copie o repositório remoto para outra pasta
  • Compartilhe a pasta e dê as permissões apropriadas.
  • Verifique se você pode acessar a pasta na sua máquina local.
  • Adicione este repositório como outro repositório remoto no repositório local. ( git remote add foo //SERVERNAME/path/to/copied/git)
  • Empurre para foo. git push foo master. Funcionou? Ótimo! Agora exclua o repositório que não está funcionando e renomeie-o para o que era antes. Verifique se as permissões e a propriedade de compartilhamento permanecem as mesmas.
Halil Kaskavalci
fonte
1
No meu caso, simplesmente copiar a pasta local para uma nova pasta, excluir a antiga e renomear a nova para o antigo nome corrigia os problemas de permissão.
mgiuffrida
2

Eu bati esse mesmo problema. Lendo por aqui, percebi que eram as permissões de arquivo às quais a mensagem estava se referindo. A correção, para mim, estava em:

/etc/inetd.d/git-gpv

Ele estava iniciando o git-daemon como usuário ' ninguém ', por isso faltava a permissão de gravação.

# Who   When    What
# GPV   20Nov13 Created this by hand while reading: http://linuxclues.blogspot.co.uk/2013/06>/git-daemon-ssh-create-repository-debian.html
# GPV   20Nov13 Changed owner (to user_git) otherise nobody lack permission to update the repository
#git stream tcp nowait nobody  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo
git stream tcp nowait user_git  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo

(Eu duvido que outros chamam seu arquivo inetd conf de git-gpv. Geralmente seria diretamente no /etc/inetd.conf)

GraemeV
fonte
1

Você precisa de permissões de gravação suficientes no diretório para o qual está empurrando.

No meu caso: servidor Windows 2008

clique com o botão direito do mouse no diretório git repo ou no diretório pai.

Propriedades> guia Compartilhamento> Compartilhamento avançado> Permissões> verifique se o usuário possui direitos de acesso apropriados.

Caqui Fuyu
fonte
1

Você pode ter aninhado acidentalmente repositórios git

IliasT
fonte
1

Também é possível que você tenha adicionado outro repositório local com o mesmo alias. Como exemplo, agora você tem duas pastas locais, originassim quando você tenta enviar por push, o repositório remoto não aceita suas credenciais.

Renomeie os aliases do repositório local, você pode seguir este link https://stackoverflow.com/a/26651835/2270348

Talvez você possa deixar um repositório local do seu agrado origine os outros os renomeiem, por exemplo, de originpara anotherorigin. Lembre-se de que são apenas aliases e tudo que você precisa fazer é lembrar os novos aliases e seus respectivos ramos remotos.

Huey Mataruse
fonte
0

Funciona para mim

sudo chmod -R g+rwX .
Nitin.
fonte
0

Eu consegui isso ao entrar em um projeto Rstudio. Percebi que esqueci de fazer:

sudo rstudio

na inicialização do programa. De fato, como há outro bug que eu tenho, eu realmente preciso:

sudo rstudio --no-sandbox
Timothy Pollington
fonte
0

Use sudo para commit -m

  • git add -A
  • sudo git commit -m "Use o sudo para commit -m"
  • origem do push do git branch_name
oparam
fonte
0

Eu estava recebendo esse problema com um repositório remoto em um compartilhamento Samba; Puxei com sucesso deste controle remoto, mas falhei ao pressioná-lo.

A causa do erro foram credenciais incorretas no meu ~/.smbcredentialsarquivo.

Josh
fonte