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>'
У меня было это раньше время от времени, и нам всегда приходилось решать эту проблему, когда каждый пользователь переходит в репозиторий и устанавливает групповые разрешения для всех файлов в нем с помощью
chmod -R g+w *
Это никогда не было удовлетворительным решением, и теперь оно укусило нас в задницу, потому что один из парней отсутствует, и никто не знает пароль пользователя его репо. Итак, я пытаюсь решить это правильно.
Кажется, ошибка возникает, когда кто-то пытается нажать на изменение, которое изменит каталог репо, принадлежащий другому пользователю (следовательно, установив опцию записи группы выше). Я немного погуглил и нашел пару обсуждаемых решений (ни одно из которых не помогло мне)
1) убедитесь, что группа, с которой разделены папки репо, является основной группой каждого пользователя (я полагаю, что это уже так: у каждого пользователя есть только одна группа, так что это должна быть их основная группа, верно?)
2) настройка git repo core.sharedRepository, как подробно описано здесь: Git: не могу нажать с одного компьютера, я изменил это, но это не имело никакого значения. Нужно ли перезагружать конфигурацию или что-то еще, чтобы фактически повлиять на изменение?
Вот как выглядит мой репозиторий:
[core]
repositoryformatversion = 0
filemode = true
bare = true
sharedRepository = all
[receive]
denyNonFastForwards = True
Благодарен за любые советы или предложения! Максимум
15 ответов
У меня была эта ошибка в течение двух недель, и большинство решений указали в качестве ответа "chmod -R", к сожалению для меня все мои репозитории git (локальные / удаленные / общие - с командой) были в ОС Windows, и хотя chmod -Rv показал, что все файлы были изменены на "rwxrwxrwx", последующий "ls -l" по-прежнему отображал все файлы как "rwxr-xr-x", и ошибка повторилась. В конце концов я увидел это решение от Арьеян де Врум. Это сработало, и мы все смогли тянуть и толкать снова.
На локальных (локальных, которые испытывают затруднения при отправке) и удаленных репозиториях выполните следующие команды:
$ git fsck
$ git prune
$ git repack
$ git fsck
Кстати, я попытался использовать собственные права доступа к файлам Windows / ACL и даже обратился к поднятию проблемного пользователя до администратора, но, похоже, ничего из этого не помогло. Не уверен, что среда важна, но она может помочь кому-то с подобной настройкой - проблемный член команды и удаленный (Windows Server 2008 R2 Standard) мой локальный (Windows 7 VM).
Более простой способ сделать это - добавить скрипт post-receive, который запускает команду chmod после каждого нажатия на репозиторий "hub" на сервере. Добавьте следующую строку в hooks/post-receive внутри вашей папки git на сервере:
chmod -Rf u+w /path/to/git/repo/objects
Это ошибка разрешения. Для меня наиболее подходящим и безопасным способом было добавление пользователей в дополнительную группу репо. принадлежит (или наоборот):
groupadd git
chgrp -R git .git
chgrp -R git ./
usermod -G -a git $(whoami)
В случае, если кто-то еще застрял с этим: это просто означает, что права на запись неправильны в репо, на который вы нажимаете. Перейдите и выполните команду chmod -R, чтобы у пользователя, к которому вы обращаетесь, был доступ на запись.
http://blog.shamess.info/2011/05/06/remote-rejected-na-unpacker-error/
Это просто работает.
Для меня эта ошибка произошла, когда на моем пульте не было места.
Мне просто нужно прочитать остальную часть сообщения об ошибке:
error: file write error (No space left on device)
fatal: unable to write sha1 file
error: unpack failed: unpack-objects abnormal exit
Что касается ошибки разрешения с использованием репозитория git в экземпляре AWS, я успешно решил ее, создав группу и рекурсивно назначив ее в папку репозитория (-R), и предоставив право на запись этой группе, а затем назначив пользователя экземпляра aws по умолчанию. (ec2-user или ubuntu) в эту группу.
1. Создайте имя группы share_group или что-то еще
sudo groupadd share_group
2. измените папку репозитория из группы "root" на "share_group"
sudo chgrp -R share_group /path/to/your/repository
3. добавить полномочия записи в share_group
sudo chmod -R g+w /path/to/your/repository
4. Последний шаг - назначить текущего пользователя - пользователя по умолчанию при входе в систему (по умолчанию ec2 - "ec2-пользователь", пользователь экземпляра ubuntu - "ubuntu" в ubuntu на aws) для share_group. Я использую Ubuntu Insance на AWS, поэтому мой пользователь по умолчанию Ubuntu.
sudo usermod -a -G share_group ubuntu
Кстати, чтобы увидеть владельца папки или файла, просто наберите:
ls -l /path/to/your/repository
'
Выход:
drwxr-x--x 2 root shared_group
(объяснение см. по адресу: https://wiki.archlinux.org/index.php/File_permissions_and_attributes).После шага 3 вы увидите
drwx--x--x 2 root root
изменился на
drwxr-x--x 2 root share_group
В этом случае я не назначил пользователя 'ubuntu' в корневую группу для обеспечения безопасности. Вы можете просто попытаться назначить пользователя по умолчанию пользователем root согласно шагу 4 (просто пропустите первые 3 шага
По-другому, пробовал решение по:
chmod -Rf u+w /path/to/git/repo/objects
У меня это не сработало, я думаю, что это должно быть причиной того, что моя папка репозитория принадлежит пользователю root, а не пользователю Ubuntu, и в 'git' по умолчанию используется пользователь по умолчанию (пользователь ec2 или пользователь Ubuntu. Вы можете попробовать изменить пользователя и проверить его. Наконец, приведенный ниже код определенно работает для меня, но 777 не годится для безопасности
sudo chmod -R 777 /path/to/your/repo
Я использую Gitosis для управления такого рода вещами. У Gitosis есть один пользователь (обычно называемый "git"), которому принадлежат все репозитории, и он использует управление доступом на основе открытого ключа к каждому репо. Это может не подходить к вашей настройке, но, вероятно, стоит проверить (не каламбур).
Я получаю похожую ошибку и, пожалуйста, смотрите ниже, как я ее исправил
Моя структура каталогов: /opt/git/project.git, а пользователь git - это git
$ cd /opt/git/project.git
$ sudo chown -R git:git .
chown с параметром -R рекурсивно меняет владельца и группу и (так как я набрал git:git в приведенной выше команде) текущего каталога. chown -R необходим, так как git изменяет многие файлы в вашем каталоге git, когда вы отправляете в репозиторий.
Эта проблема также может возникнуть после обновлений Ubuntu, которые требуют перезагрузки.
Если файл /var/run/reboot-required
существует, сделать или запланировать перезагрузку.
У меня тоже были проблемы с этим, думая, что мой удаленный администратор gitolite был поврежден или что-то не так.
Моя установка - ноутбук Mac OS X (10.6.6) с удаленным сервером Ubuntu 10 с gitolite.
Оказалось, что проблема была с моей локальной проверкой gitolite-admin.
Несмотря на ошибку "распаковать не удалось", оказалось, что проблема была локальной.
Я понял это, снова проверив это как gitolite-admin2, внеся изменения и нажав.
Вуаля! Это сработало!
Что бы это ни стоило, у меня была та же проблема с моим собственным VPS, и это было вызвано моим низким объемом жесткого диска на VPS. Подтверждено df -h
команда и после того, как я очистил жесткий диск моего VPS; проблема исчезла
Приветствия.
У меня была похожая проблема, как это раньше:
! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'https://mywebsite.com/my-git-directory.git'
В моем случае я проверил неправильное владение каталогом с помощьюls -l
. Я меняю владельца каталога наwww-data
решить проблему следующим образом:
sudo chown -R www-data:www-data my-git-directory.git/
Но в этом случае я не использую метод SSH, я использую метод HTTP.
Возможно, когда мы убедимся, что владелец каталога правильный, это может решить проблему.
Ошибка конфигурации git также может привести к этой ошибке. Я даю своим ученикам и пример такой конфигурации:
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
Один из моих студентов получил ошибку распаковщика. Другие студенты были в порядке, но я все же дважды проверил разрешения сервера git и убедился, что студент находится в правильной группе.
Наконец, я попросил студента сделать журнал git и увидел, что у него есть John Doe для его конфигурации, но его ветка была его собственным именем.
Правильная настройка его конфигурации устранила ошибку.
Там, где я работаю, мы использовали этот метод во всех наших репозиториях в течение нескольких лет без каких-либо проблем (кроме случаев, когда мы создаем новый репозиторий и забываем настроить его таким образом):
- Установите "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 {} +
Добавьте эту строку в ловушку предварительного получения в хранилище, чтобы новые разрешения доступа к файлам разрешали групповое чтение / запись:
umask 007
Для меня это проблема с разрешениями:
На сервере git выполните эту команду в каталоге репо
sudo chmod -R 777 theDirectory/