Git: не удается нажать (ошибка при распаковке), связанная с проблемами разрешения
У меня есть эта проблема, когда я пытаюсь нажать git:
error: insufficient permission for adding an object to repository database ./objects
fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To ssh://<repo url>/<repo dir>
! [remote rejected] master -> master (n/a (unpacker error))
error: failed to push some refs to 'ssh://<repo url>/<repo dir>'
У меня было это до спорадического времени, и нам всегда приходилось решать его каждым пользователем sshing для репо и устанавливать групповые разрешения для всех файлов в нем с помощью
chmod -R g+w *
Это никогда не было удовлетворительным решением, и теперь он укусил нас в задницу, когда один из парней ушел, и никто не знает пароль своего репо. Итак, я пытаюсь решить это правильно.
Ошибка возникает, когда кто-то пытается отменить изменение, которое изменит репозиторий, принадлежащий другому пользователю (следовательно, установка опции групповой записи выше). Я немного поработал над этим и нашел пару обсуждаемых решений (ни один из них не работал у меня)
1) убедитесь, что группа, к которой принадлежат репозитории, является основной группой пользователей (я считаю, что это уже так: каждый пользователь имеет только одну группу, поэтому она должна быть их основной группой, не так ли?)
2) git параметр repo core.sharedRepository, как описано здесь: Git: невозможно нажать с одного компьютера
Я изменил это, но это не имело никакого значения. Нужно ли мне перезагружать конфигурацию или что-то, чтобы действительно повлиять на изменение?
Здесь моя конфигурация repo выглядит как atm:
[core]
repositoryformatversion = 0
filemode = true
bare = true
sharedRepository = all
[receive]
denyNonFastForwards = True
Благодарен за любые советы или предложения!
макс
Ответы
Ответ 1
Более простой способ сделать это - добавить post-receive script, который запускает команду chmod
после каждого нажатия на "концентратор" репо на сервере. Добавьте следующую строку, чтобы перехватывать/отправлять сообщения внутри вашей папки git на сервере:
chmod -Rf u+w /path/to/git/repo/objects
Ответ 2
У меня была эта ошибка в течение двух недель, и большинство решений заявили "chmod -R" в качестве ответа, к сожалению, для меня мои репозитории git (локальные/удаленные/совместно используемые с командой) были в Windows OS, и хотя chmod -Rv показал все файлы, измененные на "rwxrwxrwx", последующий "ls -l" все еще показывал все файлы как "rwxr-xr-x", и ошибка повторялась сама. В итоге я увидел это решение от Ariejan de Vroom. Это сработало, и мы все смогли снова и снова тянуть.
На локальном (локальном, который вызывает затруднения) и удаленных репозиториях, выполните следующие команды:
$ git fsck
$ git prune
$ git repack
$ git fsck
С другой стороны, я пробовал использовать собственные разрешения на доступ к файлам Windows/ACL и даже прибегал к повышению проблемы пользователя до администратора, но ничто из этого не помогло. Не уверен, что среда важна, но она может помочь кому-то с аналогичной настройкой - членом команды и удаленным (Windows Server 2008 R2 Standard), моей локальной (Windows 7 VM).
Ответ 3
Это ошибка разрешения. То, что было наиболее подходящим и безопасным для меня, было добавление пользователей в дополнительную группу, что репо. принадлежит (или наоборот):
groupadd git
chgrp -R git .git
chgrp -R git ./
usermod -G -a git $(whoami)
Ответ 4
Если кто-то еще застрял в этом: это просто означает, что запись разрешения в репо, которые вы нажимаете. Go и chmod -R это так, чтобы пользователь, к которому вы обращались к серверу git, имел доступ на запись.
http://blog.shamess.info/2011/05/06/remote-rejected-na-unpacker-error/
Он просто работает.
Ответ 5
Я использую gitosis для управления такими вещами. Gitosis имеет одного пользователя (обычно называемого "git" ), который владеет всеми репозиториями, и использует управление доступом на основе открытого ключа для каждого репо. Это может не устраивать ваши настройки, но, вероятно, стоит проверить (каламбур не предназначен).
Ответ 6
Для меня эта ошибка произошла, когда я отсутствовал на своем пульте.
Мне просто нужно было прочитать остальную часть сообщения об ошибке:
error: file write error (No space left on device)
fatal: unable to write sha1 file
error: unpack failed: unpack-objects abnormal exit
Ответ 7
У меня тоже были проблемы с этим, думая, что мой удаленный гитолит-админ был поврежден или что-то не так.
Моя настройка - Mac OS X (10.6.6) ноутбук с удаленным сервером Ubuntu 10 с гитолитом.
Оказалось, что проблема связана с моей локальной проверкой gitolite-admin.
Несмотря на ошибку "unpack failed", выяснилось, что проблема была локальной.
Я понял это, проверив его снова как gitolite-admin2, внеся изменения и нажав.
Voila! Это сработало!
Ответ 8
Эта проблема также может возникать после обновления Ubuntu, требующих перезагрузки.
Если файл /var/run/reboot-required
существует, выполните или запланируйте перезапуск.
Ответ 9
Для чего это стоит, у меня была такая же проблема по сравнению с моим собственным VPS, и это было вызвано моим низким дисковым пространством на VPS. Подтверждено командой df -h
и после того, как я очистил жесткий диск VPS; проблема исчезла.
Приветствия.
Ответ 10
Для меня это проблема с разрешениями:
На сервере git выполните эту команду в каталоге репо
sudo chmod -R 777 theDirectory/
Ответ 11
Я получал схожую ошибку, и, пожалуйста, см. ниже, как я ее разрешил.
Моя структура каталогов:
/opt/ git/project.git
и git пользователь git
$ cd /opt/git/project.git
$ sudo chown -R git:git .
chown с параметром -R рекурсивно изменяет право собственности и группу (так как я напечатал git: git в приведенной выше команде) текущего каталога. chown -R необходимо, так как git изменяет многие файлы внутри вашего каталога git, когда вы нажимаете на репозиторий.
Ответ 12
Где я работаю, мы использовали этот метод во всех наших хранилищах в течение нескольких лет без каких-либо проблем (за исключением случаев, когда мы создаем новый репозиторий и забываем его настроить таким образом):
- Установите 'sharedRepository = true' в разделе конфигурационного файла [core].
-
Измените идентификатор группы в репозитории на группу, общую для всех пользователей, которым разрешено нажать на нее:
chgrp -R shared_group /git/our_repos
chmod -R g+w /git/our_repos
-
Установите бит setgid во всех каталогах в репозитории, чтобы новые файлы/каталоги сохраняли одну и ту же группу:
find /git/our_repos -type d -exec chmod g+s {} +
-
Добавьте эту строку в крюк pre-receive в репозитории, чтобы гарантировать, что новые разрешения на файл позволяют группе читать/писать:
umask 007