git не может выполнить 'pack-objects': в доступе отказано

Sep 22 2020

Я получаю эту ошибку при извлечении из только что добавленного удаленного git-сервера.

$ 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

Поиск в Google " cannot exec 'pack-objects': Permission denied" с кавычками не дал результатов, так что это не дубликат. Есть несколько вопросов по этой fatal: protocol error: bad pack headerчасти, и в ответах вроде этого предлагается добавить несколько строк, ограничивающих память .gitconfig. Это не решило мою проблему.

Основываясь на первой строке, я считаю, что у какого- pack-objectsто исполняемого файла где-то отсутствует xразрешение. Но не в этом:

$ ls -l $(which git-upload-pack)
-rwxr-xr-x 1 root root 1559256 Apr 20 10:20 /usr/bin/git-upload-pack

Для контекста, пульт - это VPS под управлением Debian 10, а клиент - это старый настольный компьютер Intel Celron около 2003 года, работающий под управлением Ubuntu 18.04. Так что ограничение ресурсов тянущей машины могло сыграть роль.

ИЗМЕНИТЬ :

Все двоичные файлы git могут быть выполнены всеми пользователями:

 $ 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

И /usr/binнаходится в моем ПУТИ:

$ 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

И я могу запустить их без 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

РЕДАКТИРОВАТЬ 2 :

У .gitкаталога тоже есть правильные разрешения:

$ 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

РЕДАКТИРОВАТЬ 3 :

У меня не установлен SELinux, поэтому я не знаю, какой контекст проверять, кроме разрешений Linux.

Я посмотрел /usr/lib/git-core. Все файлы (исполняемые файлы и символические ссылки) принадлежали root, но имели разрешения rx для всех пользователей. Самое главное:

$ 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

Кроме этих:

$ 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

РЕДАКТИРОВАТЬ 4 :

После Торека «сек предложения для проверки 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

Теперь я вижу виновного.

Ответы

1 torek Sep 23 2020 at 04:37

В редакторе 4 есть последние подсказки: проблема была на самом деле на сервере, который по какой-то причине имел /usr/lib/git-core/gitдвоичный файл как режим 754 ( rwxr-xr--), а не в режиме 755 ( rwxr-xr-x). Это означало, что никому, не являющемуся пользователем root и не входящим в группу root, не разрешалось запускать его, и простая chmodустановка этого двоичного файла на сервере решила бы проблему.

Obsidian Sep 22 2020 at 02:21

Вы, вероятно, захотите взглянуть на свой локальный .git репозиторий, особенно в .git/objects. Проверьте права и права доступа к файлам и посмотрите, имеет ли git право на их создание.

Скорее всего, произошло то, что вы, вероятно, gitодин раз запускались либо с, либо с sudoвременным входом в систему как root, используя su. Пока файлы уже существуют, это не будет проблемой, потому что они сохранят свои первоначальные права и владельцев, но если Git должен был создать несуществующие файлы, такие как подкаталог упакованных объектов, если он сделал это как root , это нормально, чтобы впоследствии не использовать их как свою обычную личность.

И это действительно могло произойти с любой командой, а не только с Git. Таким образом появляется сообщение об ошибке, в котором указывается только причина ошибки, указанная системой.

РЕДАКТИРОВАТЬ

Учитывая комментарии ниже, вы, вероятно, захотите также ознакомиться с содержанием /usr/libexec/git-core/. Он содержит все исполняемые файлы, которые фактически связаны с командами и подкомандами git.

Среди них ложь, git-pack-objectsкоторой управляет git-upload-pack. Оба они разные и разные исполняемые файлы.

Это все еще не объясняет, почему здесь были потеряны права, но остается место, на которое стоит посмотреть.

Удачи.