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.
git add
egit commit
-ing como usuário root. Corrigi-o com umagit reset
resposta e esta pergunta para corrigir as.git
permissões de diretório.Respostas:
Permissões de reparo
Depois de identificar e corrigir a causa subjacente (veja abaixo), convém reparar as permissões:
Observe que se você quiser que todos possam modificar o repositório, você não precisa do
chgrp
e 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.sharedRepository
emgit help config
). Se a saída de:não é
group
outrue
ou1
ou alguma máscara, tente executar:e execute novamente o recursivo
chmod
echgrp
(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
étrue
ougroup
, 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 :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).fonte
false
ouumask
). Vejagit help config
para mais detalhes.git push
usando 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.X
, não uma minúsculax
. Uma maiúsculaX
significa "definirS_IXGRP
se o arquivo é um diretório (ou se outroS_IX*
bit estiver definido)", para que não torne todos os arquivos executáveis. Pode ser desnecessário, mas talvez não, secore.sharedRepository
foi definido0600
em algum momento no passado.Para Ubuntu (ou qualquer Linux)
Da raiz do projeto,
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
fonte
Sorry, user myuser is not allowed to execute '/bin/chown
*
fez toda a diferença. Obrigado.ls .git
use o seguinte comando, funciona como mágica
digite o comando exatamente como é (com espaços extras e um ponto no final)
fonte
sudo chmod -R ug+w .;
Basicamente, o
.git/objects
arquivo não tem permissões de gravação. A linha acima concede permissão para todos os arquivos e pastas no diretório.fonte
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:
fonte
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
chgrp
aobjects
pasta e seu conteúdo, para que a propriedade do grupo seja ogit
grupo 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
.Atualização: eu não sabia sobre o core.sharedRepository. É bom saber, embora provavelmente faça o que precede.
fonte
Resolvido para mim ... apenas isso:
fonte
Chmod 777
não é recomendado, uma vez que expõe todo o seu arquivo para o resto do mundo fazer sua máquina vulnerávelchmod 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.Isso pode acontecer facilmente se você executou
git init
um 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
fonte
Linux, macOS:
onde
name
é o seu nome de usuário egroup
o grupo ao qual ele pertence.fonte
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:
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:
* Observe que as permissões desse arquivo foram concedidas apenas para seus usuários, ninguém nunca poderá alterá-lo ... *
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 :
Agora você e todos os usuários proprietários do arquivo terão que alterar a permissão desses arquivos, fazendo:
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:
https://coderwall.com/p/8b3ksg
fonte
username:groupname
para o meu, mas quando tenteichmod -R 774 .
, poderia executar comgit add --all
êxito.Para o meu caso, nenhuma das sugestões funcionou. Estou no Windows e isso funcionou para mim:
git remote add foo //SERVERNAME/path/to/copied/git
)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.fonte
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.
(Eu duvido que outros chamam seu arquivo inetd conf de git-gpv. Geralmente seria diretamente no /etc/inetd.conf)
fonte
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.
fonte
Você pode ter aninhado acidentalmente repositórios git
fonte
Também é possível que você tenha adicionado outro repositório local com o mesmo alias. Como exemplo, agora você tem duas pastas locais,
origin
assim 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
origin
e os outros os renomeiem, por exemplo, deorigin
paraanotherorigin
. Lembre-se de que são apenas aliases e tudo que você precisa fazer é lembrar os novos aliases e seus respectivos ramos remotos.fonte
Funciona para mim
fonte
Eu consegui isso ao entrar em um projeto Rstudio. Percebi que esqueci de fazer:
na inicialização do programa. De fato, como há outro bug que eu tenho, eu realmente preciso:
fonte
Use sudo para commit -m
fonte
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
~/.smbcredentials
arquivo.fonte