git не может выполнить 'pack-objects': в доступе отказано
Я получаю эту ошибку при извлечении из только что добавленного удаленного 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
Теперь я вижу виновного.
Ответы
В редакторе 4 есть последние подсказки: проблема была на самом деле на сервере, который по какой-то причине имел /usr/lib/git-core/gitдвоичный файл как режим 754 ( rwxr-xr--), а не в режиме 755 ( rwxr-xr-x). Это означало, что никому, не являющемуся пользователем root и не входящим в группу root, не разрешалось запускать его, и простая chmodустановка этого двоичного файла на сервере решила бы проблему.
Вы, вероятно, захотите взглянуть на свой локальный .git репозиторий, особенно в .git/objects. Проверьте права и права доступа к файлам и посмотрите, имеет ли git право на их создание.
Скорее всего, произошло то, что вы, вероятно, gitодин раз запускались либо с, либо с sudoвременным входом в систему как root, используя su. Пока файлы уже существуют, это не будет проблемой, потому что они сохранят свои первоначальные права и владельцев, но если Git должен был создать несуществующие файлы, такие как подкаталог упакованных объектов, если он сделал это как root , это нормально, чтобы впоследствии не использовать их как свою обычную личность.
И это действительно могло произойти с любой командой, а не только с Git. Таким образом появляется сообщение об ошибке, в котором указывается только причина ошибки, указанная системой.
РЕДАКТИРОВАТЬ
Учитывая комментарии ниже, вы, вероятно, захотите также ознакомиться с содержанием /usr/libexec/git-core/. Он содержит все исполняемые файлы, которые фактически связаны с командами и подкомандами git.
Среди них ложь, git-pack-objectsкоторой управляет git-upload-pack. Оба они разные и разные исполняемые файлы.
Это все еще не объясняет, почему здесь были потеряны права, но остается место, на которое стоит посмотреть.
Удачи.