Git push não pode gravar no arquivo de objeto - permissão negada

Git push não pode gravar no arquivo de objeto - permissão negada

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.

  1. 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
    
  2. 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
    
  3. 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

  4. 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 user1e alguns arquivos de propriedade de user2. O problema é que mais tarde, ao user1tentar enviar arquivos para o GIT HOST, os objectarquivos e diretórios criados podem pertencer a ele, user2portanto 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 GROUPpermissões.

  5. 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 ( gitneste 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.

informação relacionada