git não pode executar 'pack-objects': permissão negada
Estou recebendo este erro ao extrair de um remoto git auto-hospedado que acabei de adicionar.
$ git pull myremote master
fatal: cannot exec 'pack-objects': Permission denied
fatal: git upload-pack: unable to fork git-pack-objects
fatal: The remote end hung up unexpectedly
fatal: protocol error: bad pack header
Buscar " cannot exec 'pack-objects': Permission denied" no Google com aspas obteve zero resultados, portanto, esta não é uma duplicata. Existem várias perguntas sobre a fatal: protocol error: bad pack headerparte, com respostas como esta propondo adicionar algumas linhas de limitação de memória a .gitconfig. Isso não resolveu meu problema.
Com base na primeira linha, acho que algum pack-objectsexecutável em algum lugar está sem xpermissão. Mas não é este:
$ ls -l $(which git-upload-pack)
-rwxr-xr-x 1 root root 1559256 Apr 20 10:20 /usr/bin/git-upload-pack
Para contextualizar, o remoto é um VPS rodando Debian 10, enquanto o cliente é um antigo desktop Intel Celron por volta de 2003, rodando Ubuntu 18.04. Portanto, a limitação de recursos na máquina de puxar pode estar desempenhando um papel.
EDITAR :
Todos os binários git são executáveis por todos os usuários:
$ ls -l /usr/bin/git*
-rwxr-xr-x 1 root root 2759388 Apr 20 10:20 /usr/bin/git
lrwxrwxrwx 1 root root 3 Apr 20 10:20 /usr/bin/git-receive-pack -> git
-rwxr-xr-x 1 root root 1546968 Apr 20 10:20 /usr/bin/git-shell
lrwxrwxrwx 1 root root 3 Apr 20 10:20 /usr/bin/git-upload-archive -> git
-rwxr-xr-x 1 root root 1559256 Apr 20 10:20 /usr/bin/git-upload-pack
E /usr/binestá no meu CAMINHO:
$ echo $PATH
/home/keith/bin:/home/keith/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
E posso executá-los sem sudo:
$ git-upload-pack
usage: git upload-pack [<options>] <dir>
--stateless-rpc quit after a single request/response exchange
--advertise-refs exit immediately after initial ref advertisement
--strict do not try <directory>/.git/ if <directory> is no Git directory
--timeout <n> interrupt transfer after <n> seconds of inactivity
EDIT 2 :
O .gitdir parece ter as permissões corretas também:
$ ls -la .git{,/objects}
.git:
total 56
drwxr-xr-x 8 keith keith 4096 Sep 21 11:36 .
drwxr-xr-x 22 keith keith 4096 Sep 21 13:09 ..
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 branches
-rw-r--r-- 1 keith keith 290 Sep 21 11:36 config
-rw-r--r-- 1 keith keith 73 Jul 25 2017 description
-rw-r--r-- 1 keith keith 0 Sep 21 12:51 FETCH_HEAD
-rw-r--r-- 1 keith keith 23 Jul 25 2017 HEAD
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 hooks
-rw-rw-r-- 1 keith keith 1555 Sep 21 10:47 index
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 info
drwxr-xr-x 3 keith keith 4096 Jul 25 2017 logs
drwxr-xr-x 37 keith keith 4096 Jul 25 2017 objects
-rw-rw-r-- 1 keith keith 41 Apr 2 2018 ORIG_HEAD
-rw-rw-r-- 1 keith keith 46 Sep 21 10:47 packed-refs
drwxr-xr-x 5 keith keith 4096 Jul 25 2017 refs
.git/objects:
total 148
drwxr-xr-x 37 keith keith 4096 Jul 25 2017 .
drwxr-xr-x 8 keith keith 4096 Sep 21 11:36 ..
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 06
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 0a
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 17
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 22
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 29
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 2d
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 30
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 32
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 35
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 3c
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 3f
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 43
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 4f
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 50
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 53
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 5a
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 5f
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 6e
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 72
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 82
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 96
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 a5
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 a8
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 b4
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 b7
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 b9
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 bc
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 c0
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 c3
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 c9
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 cd
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 e7
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 ea
drwxr-xr-x 2 keith keith 4096 Jul 25 2017 info
drwxr-xr-x 2 keith keith 4096 Apr 2 2018 pack
EDITAR 3 :
Eu não tenho o SELinux instalado, então não sei que contexto verificar, exceto as permissões do Linux.
Eu olhei /usr/lib/git-core. Todos os arquivos (executáveis e links simbólicos) eram de propriedade do root, mas tinham permissões rx para todos os usuários. Mais importante:
$ ls -lhZ /usr/lib/git-core/{git-upload-pack,git-pack-objects}
lrwxrwxrwx 1 root root ? 3 Apr 20 10:20 /usr/lib/git-core/git-pack-objects -> git
-rwxr-xr-x 1 root root ? 1.5M Apr 20 10:20 /usr/lib/git-core/git-upload-pack
Exceto estes:
$ ls -lhZ /usr/lib/git-core/git-sh-*
-rw-r--r-- 1 root root ? 2.3K Apr 20 10:20 /usr/lib/git-core/git-sh-i18n
-rwxr-xr-x 1 root root ? 1.5M Apr 20 10:20 /usr/lib/git-core/git-sh-i18n--envsubst
-rw-r--r-- 1 root root ? 16K Apr 20 10:20 /usr/lib/git-core/git-sh-prompt
-rw-r--r-- 1 root root ? 9.1K Apr 20 10:20 /usr/lib/git-core/git-sh-setup
EDITAR 4 :
Seguindo a sugestão de torek para verificar , eu loguei lá e verifiquei os mesmos suspeitos:myremote
$ ls -lhZ /usr/bin/git* -rwxr-xr-x 1 root root ? 2.7M Apr 19 18:19 /usr/bin/git lrwxrwxrwx 1 root root ? 3 Apr 19 18:19 /usr/bin/git-receive-pack -> git -rwxr-xr-x 1 root root ? 1.5M Apr 19 18:19 /usr/bin/git-shell lrwxrwxrwx 1 root root ? 3 Apr 19 18:19 /usr/bin/git-upload-archive -> git lrwxrwxrwx 1 root root ? 3 Apr 19 18:19 /usr/bin/git-upload-pack -> $ ls -lhZ /usr/lib/git-core/{git-upload-pack,git-pack-objects,git}
-rwxr-xr-- 1 root root ? 2.7M Apr 19 18:19 /usr/lib/git-core/git
lrwxrwxrwx 1 root root ? 3 Apr 19 18:19 /usr/lib/git-core/git-pack-objects -> git
lrwxrwxrwx 1 root root ? 3 Apr 19 18:19 /usr/lib/git-core/git-upload-pack -> git
Agora vejo o culpado.
Respostas
O Edit 4 tem as pistas finais: o problema estava na verdade no servidor, que por algum motivo tinha o /usr/lib/git-core/gitbinário no modo 754 ( rwxr-xr--), ao invés do modo 755 ( rwxr-xr-x). Isso significava que qualquer pessoa que não fosse usuário root e não estivesse no grupo root não tinha permissão para executá-lo, e um simples chmoddesse binário no servidor resolveria o problema.
Você provavelmente deseja dar uma olhada em seu repositório local .git , especialmente em .git/objects. Verifique as owers e permissões dos arquivos e veja se git tem o direito de criá-los.
O que provavelmente aconteceu é que você provavelmente executou gituma vez com sudoou está temporariamente logado como root usando su. Contanto que os arquivos já existam, não será um problema porque eles manterão seus direitos e proprietários originais, mas se o Git tivesse que criar arquivos inexistentes, como o subdiretório do objeto empacotado, se ele fez como root , é normal ser incapaz de explorá-los como sua identidade normal posteriormente.
E isso realmente pode acontecer com qualquer comando, não simplesmente Git. Assim surge a mensagem de erro, que apenas informa o motivo do erro fornecido pelo sistema.
EDITAR
Considerando os comentários abaixo, você provavelmente desejará verificar o conteúdo de /usr/libexec/git-core/também. Ele contém todos os executáveis que estão realmente associados aos comandos e subcomandos git.
Entre eles, mentiras git-pack-objectsque correm git-upload-pack. Ambos são executáveis diferentes e distintos.
Ainda não explica por que os direitos teriam sido perdidos aqui, mas continua sendo um lugar para se olhar.
Boa sorte.