Erro ao enviar para o GitHub - permissão insuficiente para adicionar um objeto ao banco de dados do repositório

126

Estou recebendo um erro incomum ao tentar executar um "git push" no meu repositório GitHub:

Contando objetos: 8, pronto.
Compressão delta usando 2 threads.
Compactando objetos: 100% (4/4), pronto.
Escrevendo objetos: 100% (5/5), 1,37 KiB, pronto.
Total 5 (delta 2), reutilizado 0 (delta 0)
error: permissão insuficiente para adicionar um objeto ao repositório de banco de dados ./objects

fatal: falha ao gravar o objeto
error: unpack-objects saiu com o código de erro 128
erro: falha ao descompactar: ​​saída anormal dos objetos descompactados
Para [email protected]: bixo / bixo.git
 ! [remoto rejeitado] mestre -> mestre (n / a (erro de descompactação))
erro: falha ao enviar algumas referências para '[email protected]: bixo / bixo.git'
  • Após um clone limpo do GitHub, eu posso editar / adicionar / confirmar / enviar um arquivo modificado.
  • Se eu repetir isso uma segunda vez, recebo o erro acima.
  • Posso enviar para outros repositórios do GitHub muito bem.
  • Eu verifiquei as permissões de arquivo / diretório do meu lado e elas parecem OK.
  • Estou executando o git 1.6.2.3 no Mac OS X 10.5.8

O repositório acima foi a fonte da minha diversão para uma pergunta anterior do Stack Overflow ( SO 1904860 ), então talvez o repositório do GitHub tenha sido corrompido. O único problema semelhante que encontrei através da pesquisa foi um problema de descompactação relatado no github. Alguém já teve esse problema antes, principalmente quando não está usando o GitHub?

kkrugler
fonte
1
Outra dica para as pessoas com esse erro: recebi esse erro porque estava usando o usuário errado para enviar por push. Meu servidor tem usuário fooe git; ambos podem ler /opt/git/<repo>, mas apenas gitpodem escrever para ele. gito padrão é o usuário atual, se não houver nenhum .git/config, o que eu esqueci. Nenhuma das respostas elaboradas abaixo foi necessária.
Sebastian

Respostas:

209

Quando você vê esse erro fora do github, aqui está uma solução.

Obtive isso em: http://mapopa.blogspot.com/2009/10/git-insufficient-permission-for-adding.html

ssh me@myserver
cd repository/.git

sudo chmod -R g+ws *
sudo chgrp -R mygroup *

git config core.sharedRepository true

Depois disso, o daemon git deve usar as permissões de arquivo de grupo ao gravar em .git / objects.

syvex
fonte
4
+1 Funcionou para nós. Para que servem os 's' sudo chmod -R g+ws *?
11117 Erik B
5
Isso permitirá que novos arquivos criados por outro usuário mantenham as permissões de grupo do diretório raiz. Caso contrário, você terá erros ao enviar para o repositório. Veja setuid e setgid
syvex,
Eu obtive o mesmo erro com o Gitorious no Debian 6 e no PHPStorm IDE, com esta mensagem "erro: permissão insuficiente para adicionar um objeto ao repositório de banco de dados .git / objects". Eu usei esta solução na pasta pai do projeto, funciona bem com o truque "+ s".
22413 Benj
3
repo-config está obsoleto. Deveria ser git config core.sharedRepository true.
Lpapp 28/01
4
Nota: se você usar o curinga " ", arquivos e pastas ocultos (como .git!) Podem não ser afetados! Portanto, se o acima não funciona para você, execute os comandos para ./.git bem
Ben Rogmans
54

Geralmente, esse problema é causado por permissões incorretas de usuário e grupo no sistema de arquivos dos servidores Git. O repositório git deve ser de propriedade do usuário e também do seu grupo.

Exemplo:

Se o usuário for chamado "git", o grupo "gitgroup" e o local do repositório Git for: [email protected]: path / to / repo.git

então faça um:

sudo chown -R git: caminho do gitgroup / para / repo.git /

Isso corrigiu o erro de permissão insuficiente do git para mim.

Bijan
fonte
chown: usuário inválido: `git: git '
Alan Coromano 01/04
4
@MariusKavansky tentar $ USUÁRIO: $ usuário em vez de git: git
dwurf
Isso funciona apenas por algum tempo no meu caso. Eu tenho que refazê-lo depois de alguns empurrões.
BUZZ-Dee
Esta é a melhor resposta, mas você deve dizer que pode limitar o chown a ".git / objects" e o usuário que você chama de "git" é apenas o usuário com quem você está logado. O fato de o usuário ser conhecido ou não pelo servidor git não é importante.
Tristan
34
sudo chmod 777 -R .git/objects
Farid Movsumov
fonte
4
Isso funcionou para mim ... mas WTF ?? Tenho vindo a actualizar o repo por meses e isso de repente começou esta tarde ...
GojiraDeMonstah
A correção para mim foi quase a mesma, mas envolveu alterar / corrigir o proprietário de alguns dos arquivos no diretório .git. Eu fiz alguma manutenção do git enquanto estava logado como 'root', e isso parecia ter mudado o proprietário para root ou criado alguns novos arquivos com o proprietário da raiz na qual o git estava usando. Eu tinha um script de implantação automática em execução sob o proprietário 'apache' que então parou de funcionar.
coatesap
9
chmod 777nunca é uma boa solução, apenas uma solução insegura. Tente @ resposta de Syvex vez (com setgid)
4wk_
10

Isso aconteceu comigo quando tentei git pull. Algumas análises mostraram que alguém havia se comprometido com a raiz no passado, criando alguns objetos com propriedade de raiz .git/objects.

Então eu corri

cd <repo>
la .git/objects/

e isso mostrou a rootpropriedade de alguns objetos (diretórios) como este:

user@host:/repo> la .git/objects/
total 540
drwxr-xr-x 135 user user 4096 Jun 16 16:29 .
drwxr-xr-x   8 user user 4096 Jun 16 16:33 ..
drwxr-xr-x   2 user user 4096 Mar  1 17:28 01
drwxr-xr-x   2 user user 4096 Mar  1 17:28 02
drwxr-xr-x   2 user user 4096 Jun 16 16:27 03
drwxr-xr-x   2 user user 4096 Mar  3 13:22 04
drwxr-xr-x   2 root root 4096 Jun 16 16:29 05
drwxr-xr-x   2 user user 4096 Jun 16 16:28 07
drwxr-xr-x   2 root root 4096 Jun 16 16:29 08

Então eu corri

sudo chown -R user:user .git/objects/

e funcionou!

Eu estava substituindo o usuário pelo meu usuário real, é claro.

Thomas
fonte
4

Nada do acima funcionou para mim. Algumas horas depois, encontrei o motivo do problema: usei um repositório do tipo

ssh://[email protected]/~git/repo.git

Infelizmente, eu armazenei uma sessão de massa com o nome example.comque foi configurado para fazer login como usuário myOtherUser.

Então, enquanto eu pensava que o git se conecta ao host example.comcom o usuário 'git', o Git / TortoiseGit se conectou à sessão de massa example.comque usa o usuário myOtherUser. Isso leva ao mesmo ..insufficient permission..erro exato (porque os dois usuários estão em grupos diferentes).

Solução: renomeie a sessão de massa example.compara[email protected]

Zensursula
fonte
4

chmod deve ser mostrado, então a linha correta é:

sudo chown -R gituser:gituser objects
rubyan
fonte
3

Curiosamente, eu tive esse problema em um clone do repositório que tinha, mas não em outro. Além de clonar novamente o repositório (o que um colega de trabalho fez para solucionar esse problema com êxito), consegui fazer uma "redefinição do git" para o commit que eu tinha antes do início das falhas. Em seguida, confirmei novamente as alterações e consegui avançar com êxito depois disso. Portanto, apesar de todas as indicações, houve um problema no servidor; nesse caso, aparentemente isso indica alguma estranheza no repositório local.

dotdotdotPaul
fonte
3

Eu estava recebendo esse erro porque toda vez que um usuário envia algum conteúdo, o grupo do arquivo é alterado para o usuário. E, se outro usuário tentasse entrar no repositório, isso causaria erro de permissão e o envio foi rejeitado. Portanto, é necessário solicitar ao seu administrador de sistema que altere as configurações do repositório para que o grupo de qualquer arquivo no repositório não seja alterado para qualquer envio por qualquer usuário.

Para evitar esse problema, verifique se, ao inicializar seu repositório git, use o comando "git init --shared = group".

Arun Chaudhary
fonte
para obter mais explicações, você pode ver o link stackoverflow.com/questions/16183345/…
Arun Chaudhary
2

Se você ainda receber esse erro depois de definir as permissões, poderá ser necessário modificar sua máscara de criação. Descobrimos que nossas novas confirmações (pastas sob objetos) ainda estavam sendo criadas sem permissão de gravação em grupo, portanto, apenas a pessoa que as confirmou poderia enviar para o repositório.

Corrigimos isso definindo a umask dos usuários do SSH como 002 com um grupo apropriado compartilhado por todos os usuários.

por exemplo

umask 002

onde o 0 do meio está permitindo a gravação do grupo por padrão.

scipilot
fonte
Você tem certeza de que existe esse comando no Unix ou Linux? Porque tenho certeza de que umask não é específica do local.
Jan Hudec
Sim, desculpe, você está certo - não sei por que pensei que tinha um parâmetro extra de diretório. Simplesmente se aplica ao usuário. Eu atualizei o comentário.
Scipilot # 15/12
2

Depois de adicionar algumas coisas ... comprometa-as e, depois de tudo terminado, empurre! BANG !! Inicie todos os problemas ... Como você deve observar, 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, você deve 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, isso torna o repositório gravável em grupo, faça-o executando:

$ git config core.sharedRepository group

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

helmedeiros
fonte
2

Tente fazer o seguinte:

Vá para o seu servidor

    cd rep.git
    chmod -R g+ws *
    chgrp -R git *
    git config core.sharedRepository true

Em seguida, vá para a sua cópia de trabalho (repositório local) e reembale-a git repack master

Funciona perfeitamente para mim.

Aleksei
fonte
2

você pode usar isso

sudo chown -R $USER:$USER "$(git rev-parse --show-toplevel)/.git"
Tấn Tâm
fonte
1
O que isso está fazendo? Você pode adicionar uma explicação?
Anubian Noob
isso obterá o diretório de nível superior do seu repositório, portanto, o comando funcionará independentemente de onde você está atualmente. Se você já está na raiz, basta executar o sudo chown -R $ USER: $ USER .git
Tâm
Edite-o na sua pergunta. Caso contrário, sua pergunta é bastante inútil.
Anubian Noob
2
sudo su root

chown -R user:group dir

O diretório é seu repositório Git.

Então faça:

git pull origin master

Você verá alterações sobre confirmações por outras pessoas.

user3544610
fonte
2
 user@M063:/var/www/html/app/.git/objects$ sudo chmod 777 -R .git/objects
 user@M063:/var/www/html/app/.git/objects$ sudo chown -R user:user .git/objects/
Mohd Bashir
fonte
1

OK - verifica-se que houve um problema de permissão no GitHub que ocorreu durante a bifurcação do emi / bixo para o bixo / bixo. Depois que o Tekkub os corrigiu, começou a trabalhar novamente.

kkrugler
fonte
o que aconteceu e como você corrigiu isso? Eu sei que foi há algum tempo atrás ... alguma idéia?
Metagrapher
1
Foi um problema do lado do GitHub - então eu não sei exatamente o que eles fizeram para corrigi-lo, apenas que o "Tekkub" no GitHub disse "eu corrigi as permissões" e funcionou.
Krugler
Legal. Obrigado pela informação. Acabei re-clonando o repositório. Subótimo, mas funcionou. Felicidades!
Metagrapher)
4
Corrigimos a falha . Então ele não receberá mais um salário, então tudo funcionará naturalmente.
1937 Alan Alan
1

Como o erro lida com permissões na pasta de objetos, fiz uma tarefa diretamente na pasta de objetos e funcionou para mim.

n00shie
fonte
1

Isso funciona:

sudo chmod -R gituser.gituser objects
eeepage
fonte
1
Não. chmodAltera as permissões de arquivo e precisa de modos como argumentos, não usuários e grupos. É chmod -R ${some_octal_num} blaouchown -R ${some_user}:${some_group} bla
Dennis Winter
1

Eu acho que muitos como eu acabam em fóruns como este quando o problema do git, conforme descrito acima, ocorre. No entanto, existem tantas causas que podem levar ao problema que eu só quero compartilhar o que causou meus problemas para que outros aprendessem, como eu já aprendi acima.

Tenho meus repositórios em um NAS Linux da sitecom (nunca compre NAS da Sitecom, por favor). Eu tenho um repositório aqui que é clonado em muitos computadores, mas que de repente me foi negado pressionar. Recentemente, instalei um plug-in para que meu NAS pudesse permanecer como um servidor squeezebox.

Este servidor procura mídia para compartilhar. O que eu não sabia era que, possível por causa de um bug, o servidor altera a configuração de usuário e grupo para espremer: user para todos os arquivos em que ele pesquisa. E isso é TODOS os arquivos. Alterando assim os direitos que tive que pressionar.

O servidor se foi e as configurações de direitos apropriadas são restabelecidas e tudo funciona perfeitamente.

eu usei

chmod -R g+ws *
chown -R <myuser>:<mygroup> *

Onde myuser e mygroup fora do curso devem ser substituídos pelas configurações apropriadas para o seu sistema. tente git: git ou gituser: gituser ou qualquer outra coisa que você possa gostar.,

user2581924
fonte
1

Verifique o repositório: $ git remote -v

origin  ssh://[email protected]:2283/srv/git/repo.git (fetch)
origin  ssh://[email protected]:2283/srv/git/repo.git (push)

Observe que há uma substring 'git @' aqui, ele instrui o git a se autenticar como nome de usuário 'git' no servidor remoto. Se você omitir essa linha, o git será autenticado com um nome de usuário diferente; portanto, esse erro ocorrerá.

Sergey
fonte
1

No meu caso, não havia autenticação unificada (por exemplo, no domínio + serviço semelhante ao AD) entre minha máquina e o servidor virtual git. Portanto, os usuários e o grupo git são locais para o servidor virtual. No meu caso, meu usuário remoto (que eu uso para fazer login no servidor remoto) não foi adicionado ao grupo git remoto.

ssh root@<remote_git_server>
usermod -G <remote_git_group> <your_remote_user>

Depois disso, verifique as permissões descritas nas postagens acima ...

Vitaly Isaev
fonte
1

Você tentou sudo git push -u origin --all ? Às vezes, é a única coisa que você precisa para evitar esse problema. Ele solicita a senha do sistema administrativo - a que você pode fazer login na sua máquina - e é isso que você precisa enviar - ou confirmar, se for o caso.

Filipe Fernandes
fonte