Estou em um repositório clonado e tentando enviar para minha filial remota. O commit funciona muito bem, mas sempre que tento fazer push, recebo o seguinte:
error: unable to write file ./objects/foo/bar: Permission denied
Eu possuo todos os arquivos no repositório local e geralmente o push funciona bem, mas depois de algum tempo esse erro ocorre e não consigo fazer o push.
A única coisa que resolve o problema é reverter para o último commit na origem e tentar encontrar o arquivo que supostamente está causando o problema.
Em seguida, toco em um novo arquivo e colo o conteúdo do antigo arquivo "quebrado". Às vezes, isso também não ajuda e, obviamente, não é uma solução alternativa gerenciável.
Responder1
Eu me deparei com esse problema e encontrei esta pergunta. Eu li a dica postada emhttps://www.thegeekstuff.com/2017/05/git-push-error/e resumirá o que resolveu o problema (para mim).
A correção foi configurar o host que contém o GIT REPO para que contivesse um grupo compartilhado ao qual todos os usuários git fossem adicionados. Por exemplo, /etc/group
git:x:4001:user1,user2
Em seguida, no host que contém o repositório git, execute os seguintes comandos:
cd /local/git-repos/repo1.git
sudo chgrp -R git objects
sudo chmod -R g+rws objects
Para mim, isso resolveu o problema. O artigo referenciado explica mais sobre como configurar um repositório como um repositório compartilhado, mas (ainda) não fiz isso.
git config core.sharedRepository group
Por que isso pode acontecer? Continue lendo se você estiver interessado.
Por que isso acontece
Para mim, isso aconteceu quando configurei um repositório git privado que eu (usuário1) estava compartilhando com alguns colegas de trabalho. O repositório estava no meu host (digamos host1) e user2@host2 também o estava usando.
Abaixo estão as etapas que usei para configurar isso e, no local apropriado, explico onde o problema ocorre.
Eu sou user1@host1 e crio um repositório git simples usando:
mkdir /local/git-repos cd /local/git-repos git init --bare repo1.git
Eu configurei um arquivo ~/.ssh/config para que o nome usado para o repositório git seja um nome lógico. Isso é feito para que, se eu mover minha caixa para outra máquina, tudo o que preciso fazer é atualizar meu alias de host para o novo nome do computador.
Arquivo:
$HOME/.ssh/config
Host mygithost HostName host1
Eu então clonei o repositório usando
cd $HOME git clone mygithost:/local/git-repos/repo1.git cd repo1 # Add files and use normal git commands git add -u . git commit git push
As atualizações são enviadas para o repositório git no computador
Configure o usuário2 para que eles possam acessar este mesmo repositório GIT
- Você precisará configurar o arquivo $HOME/.ssh/config conforme feito para o usuário1.
- Certifique-se de que o usuário tenha um ssh no host1 como ele mesmo.
ssh user2@mygithost echo it worked cd $HOME git clone mygithost:/local/git-repos/repo1.git
Neste ponto, ambos os usuários, usuário1 e usuário2, podem acessar o repositório GIT compartilhado.
SeAMBOSos usuários fazem commits, então os arquivos do objeto git REPO terão alguns arquivos de propriedade
user1
e alguns arquivos de propriedade deuser2
. O problema é que mais tarde, aouser1
tentar enviar arquivos para o GIT HOST, osobject
arquivos e diretórios criados podem pertencer a ele,user2
portanto ocorre o seguinte erro.error: insufficient permission for adding an object to repository database ./objects fatal: failed to write object error: unpack failed: unpack-objects abnormal exit ! [remote rejected] master -> master (n/a (unpacker error)) error: failed to push some refs to [email protected]:/home/git/myproj
A solução é configurar o repositório git bare para que qualquer usuário possa ler/gravar arquivos criados por qualquer outro usuário. Isso é feito na próxima etapa, usando
UNIX GROUP
permissões.Configure o REPO para que diferentes usuários possam acessar o repositório git.
Crie um GRUPO do qual todos os usuários possam fazer parte
sudo vi /etc/group git:x:4001:user1,user2
Altere todos os arquivos para que fiquem corretamente no grupo recém-criado.
cd /local/git-repos/repo1.git sudo chgrp -R git objects sudo chmod -R g+rws objects
Use qualquer grupo compartilhado que você criou acima (
git
neste exemplo).
NOTA: O bit group-suid é importante porque faz com que arquivos/diretórios futuros criados mantenham as mesmas configurações do diretório pai. Dehttps://www.redhat.com/sysadmin/suid-sgid-sticky-bit, diz:
Se definido em um diretório, todos os arquivos criados no diretório terão sua propriedade de grupo definida como a do proprietário do diretório
Resumo
Este erro normalmente não deve acontecer em nenhum GIT REPO normalmente hospedado. Mas isso pode acontecer na situação descrita em que um repositório privado (baseado em arquivo) é configurado e compartilhado por vários usuários.