Ошибка при отправке на GitHub - недостаточно прав для добавления объекта в базу данных репозитория

126

Я получаю сообщение об необычной ошибке при попытке выполнить "git push" в моем репозитории GitHub:

Подсчет объектов: 8, готово.
Дельта-сжатие с использованием 2 потоков.
Сжатие объектов: 100% (4/4), готово.
Написание объектов: 100% (5/5), 1,37 Кбайт, готово.
Всего 5 (дельта 2), повторно используется 0 (дельта 0)
ошибка: недостаточно прав для добавления объекта в базу данных репозитория ./objects

фатальный: не удалось записать объект
ошибка: распаковка-объекты завершились с кодом ошибки 128
ошибка: ошибка распаковки: сбой при распаковке объектов
Кому git@github.com: bixo / bixo.git
 ! [удаленное отклонение] мастер -> мастер (н / д (ошибка распаковщика))
ошибка: не удалось отправить некоторые ссылки на 'git@github.com: bixo / bixo.git'
  • После чистого клона из GitHub я могу редактировать / добавлять / фиксировать / отправлять измененный файл.
  • Если я повторю это во второй раз, я получу указанную выше ошибку.
  • Я могу просто нажать на другие репозитории GitHub.
  • Я проверил права доступа к файлам / каталогам на своей стороне, и они кажутся нормальными.
  • Я запускаю git 1.6.2.3 в Mac OS X 10.5.8

Вышеупомянутый репозиторий был источником моего удовольствия для предыдущего вопроса о переполнении стека ( SO 1904860 ), поэтому, возможно, репозиторий GitHub был поврежден. Единственная похожая проблема, которую я обнаружил при поиске, - это проблема с ошибкой при распаковке, о которой сообщалось на github. Кто-нибудь еще сталкивался с этой проблемой раньше, особенно когда не использует GitHub?

kkrugler
источник
1
Еще один совет для людей с этой ошибкой: я получил эту ошибку, потому что я использовал не того пользователя для отправки. На моем сервере есть пользователь fooи git; оба могут читать /opt/git/<repo>, но gitмогут только писать в него. gitпо умолчанию используется текущий пользователь, если ничего не указано .git/config, о чем я забыл. Ни один из приведенных ниже подробных ответов не потребовался.
Себастьян

Ответы:

209

Если вы видите эту ошибку за пределами github, вот решение.

Получил из: http://mapopa.blogspot.com/2009/10/git-insufficient-permission-for-adding.html

ssh me@myserver
cd repository/.git

sudo chmod -R g+ws *
sudo chgrp -R mygroup *

git config core.sharedRepository true

После этого демон git должен использовать права доступа к групповому файлу при записи в .git / objects.

syvex
источник
4
+1 У нас сработало. Что значит "в" sudo chmod -R g+ws *?
Erik B
5
Это позволит любым новым файлам, созданным другим пользователем, поддерживать групповые разрешения корневого каталога. В противном случае у вас будут ошибки, отправляемые в репозиторий. См. Setuid и setgid
syvex 07
У меня такая же ошибка с Gitorious в Debian 6 и PHPStorm IDE, с этим сообщением «ошибка: недостаточно прав для добавления объекта в базу данных репозитория .git / objects». Я использовал это решение в родительской папке проектов, отлично работает с трюком "+ s".
Benj
3
repo-config устарел. Должно быть git config core.sharedRepository true.
lpapp
4
Примечание: если вы используете подстановочный знак " ", это не повлияет на скрытые файлы и папки (например, .git!)! Так что, если выше не работает для вас, выполните команды для ./.git а
Бен Rogmans
54

Обычно эта проблема вызвана неправильными правами пользователя и группы в файловой системе сервера Git. Репозиторий git должен принадлежать пользователю, а также его группе.

Пример:

Если ваш пользователь называется «git», его группа «gitgroup» и расположение репозитория Git: git@mygitserverxyz.com: путь / к / repo.git

затем выполните:

sudo chown -R git: gitgroup путь / к / repo.git /

Это исправило ошибку недостаточного разрешения git для меня.

Bijan
источник
chown: invalid user: `git: git '
Алан Коромано 01
4
@MariusKavansky, попробуйте $ USER: $ USER вместо git: git
dwurf
В моем случае это работает только некоторое время. Придется переделать после нескольких нажатий.
BuZZ-dEE
Это лучший ответ, но вы должны сказать, что можете ограничить chown до «.git / objects», а пользователь, которого вы называете «git», - это просто пользователь, с которым вы вошли в систему. То, что git-сервер знает пользователя или нет, не имеет значения.
Тристан
34
sudo chmod 777 -R .git/objects
Фарид Мовсумов
источник
4
Это сработало для меня ... но, черт возьми ?? Я обновлял репо в течение нескольких месяцев, и это внезапно началось сегодня днем ​​...
GojiraDeMonstah
Исправление для меня было почти таким же, но включало изменение / исправление владельца некоторых файлов в каталоге .git. Я выполнил некоторое обслуживание git, пока входил в систему как «root», и это, похоже, либо сменило владельца на root, либо создало несколько новых файлов с владельцем root, на который git полагался. У меня был скрипт автоматического развертывания, запущенный под владельцем apache, который затем перестал работать.
coatesap
9
chmod 777никогда не бывает хорошим решением, это просто небезопасный обходной путь. Попробуйте вместо этого ответ @Syvex (с setgid)
4wk_ 09
10

Это случилось со мной, когда я попытался git pull. Некоторый анализ показал, что кто-то в прошлом совершал коммит с root-правами, тем самым создавая объекты с root-правами в .git/objects.

Так что я побежал

cd <repo>
la .git/objects/

и это показывает rootправо собственности на некоторые объекты (каталоги), например:

user@host:/repo> la .git/objects/
total 540
drwxr-xr-x 135 user user 4096 Jun 16 16:29 .
drwxr-xr-x   8 user user 4096 Jun 16 16:33 ..
drwxr-xr-x   2 user user 4096 Mar  1 17:28 01
drwxr-xr-x   2 user user 4096 Mar  1 17:28 02
drwxr-xr-x   2 user user 4096 Jun 16 16:27 03
drwxr-xr-x   2 user user 4096 Mar  3 13:22 04
drwxr-xr-x   2 root root 4096 Jun 16 16:29 05
drwxr-xr-x   2 user user 4096 Jun 16 16:28 07
drwxr-xr-x   2 root root 4096 Jun 16 16:29 08

Затем я побежал

sudo chown -R user:user .git/objects/

и это сработало!

Конечно, я заменял пользователя моим настоящим пользователем.

Томас
источник
4

Ничего из вышеперечисленного у меня не сработало. Через пару часов я нашел причину проблемы: я использовал URL-адрес репо типа

ssh://git@example.com/~git/repo.git

К сожалению, я сохранил сеанс замазки с именем, example.comнастроенным для входа в систему как пользователь myOtherUser.

Итак, хотя я думал, что git подключается к хосту example.comс помощью пользователя git, Git / TortoiseGit подключился к сеансу замазки, example.comкоторый использует User myOtherUser. Это приводит к одной и той же ..insufficient permission..ошибке (потому что оба пользователя находятся в разных группах).

Решение: переименуйте сеанс шпатлевки example.comнаmyOtherUse@example.com

Zensursula
источник
4

chmod должен быть chown, поэтому правильная строка:

sudo chown -R gituser:gituser objects
rubyan
источник
3

Как ни странно, у меня была эта проблема на одном клоне репо, который у меня был, но не на другом. Помимо повторного клонирования репозитория (что сделал мой коллега, чтобы успешно обойти эту проблему), мне удалось выполнить «git reset» для фиксации, которая была у меня до начала сбоев. Затем я повторно зафиксировал изменения, и после этого смог успешно продвинуться. Таким образом, несмотря на все признаки, что на сервере была проблема, в данном случае, очевидно, это указывало на некоторую странность в локальном репо.

dotdotdotPaul
источник
3

Я получал эту ошибку, потому что каждый раз, когда пользователь нажимал какой-либо контент, группа файла менялась на пользователя. А затем, если какой-либо другой пользователь пытался выполнить загрузку в репозиторий, это вызывало ошибку разрешения, и отправка была отклонена. Таким образом, нужно попросить вашего системного администратора изменить настройки репозитория, чтобы группа любого файла в репозитории не изменялась ни при каком нажатии любым пользователем.

Чтобы избежать такой проблемы, убедитесь, что при инициализации репозитория git используйте команду «git init --shared = group».

Арун Чаудхари
источник
для более подробного объяснения вы можете увидеть ссылку stackoverflow.com/questions/16183345/…
Арун Чаудхари
2

Если вы по-прежнему получаете эту ошибку позже, после установки разрешений, вам может потребоваться изменить маску создания. Мы обнаружили, что наши новые коммиты (папки под объектами) все еще создаются без разрешения на запись для группы, поэтому только тот, кто их совершил, может отправить их в репозиторий.

Мы исправили это, установив umask пользователей SSH на 002 с соответствующей группой, общей для всех пользователей.

например

umask 002

где средний 0 по умолчанию разрешает групповую запись.

scipilot
источник
Вы уверены, что такая команда есть в Unix или Linux? Потому что я совершенно уверен, что umask не зависит от местоположения.
Ян Худек
Да, извините, что вы правы - я не знаю, почему я подумал, что у него есть дополнительный параметр каталога. Это просто относится к пользователю. Я обновил комментарий.
scipilot
2

После того, как вы добавите что-то ... зафиксируйте их и после того, как все закончите, нажмите! BANG !! Начать все проблемы ... Как вы могли заметить, есть некоторые различия в способах определения как новых, так и существующих проектов. Если кто-то другой попытается добавить / зафиксировать / протолкнуть те же файлы или контент (git сохраняет оба как те же объекты), мы столкнемся со следующей ошибкой:

$ git push
Counting objects: 31, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (21/21), 2.07 KiB | 0 bytes/s, done.
Total 21 (delta 12), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects  remote: fatal: failed to write object

Чтобы решить эту проблему, вы должны иметь в виду систему разрешений операционной системы, поскольку в этом случае вы ограничены ею. Чтобы лучше понять проблему, проверьте папку с объектами git (.git / objects). Вероятно, вы увидите что-то подобное:

<your user_name>@<the machine name> objects]$ ls -la
total 200
drwxr-xr-x 25 <your user_name> <group_name> 2048 Feb 10 09:28 .
drwxr-xr-x  3 <his user_name> <group_name> 1024 Feb  3 15:06 ..
drwxr-xr-x  2 <his user_name> <group_name> 1024 Jan 31 13:39 02
drwxr-xr-x  2 <his user_name> <group_name> 1024 Feb  3 13:24 08

* Обратите внимание, что права доступа к этим файлам были предоставлены только вашим пользователям, никто никогда не сможет их изменить ... *

Level       u   g   o
Permission rwx r-x ---
Binary     111 101 000
Octal       7   5   0

РЕШЕНИЕ ПРОБЛЕМЫ

Если у вас есть разрешение суперпользователя, вы можете пойти дальше и изменить все разрешения самостоятельно, используя второй шаг, в любом другом случае вам нужно будет спросить всех пользователей с объектами, созданными с их пользователями, используйте следующую команду, чтобы узнать, кто они :

$ ls -la | awk '{print $3}' | sort -u 
<your user_name>
<his user_name>

Теперь вам и всем пользователям-владельцам файлов придется изменить права доступа к этим файлам, выполнив:

$ chmod -R 774 .

После этого вам нужно будет добавить новое свойство, которое эквивалентно --shared = group done для нового репозитория, согласно документации, это сделает группу репозитория доступной для записи, сделайте это, выполнив:

$ git config core.sharedRepository group

https://coderwall.com/p/8b3ksg

helmedeiros
источник
2

Попробуйте сделать следующее:

Зайдите на свой сервер

    cd rep.git
    chmod -R g+ws *
    chgrp -R git *
    git config core.sharedRepository true

Затем перейдите в свою рабочую копию (локальный репозиторий) и перепакуйте ее git repack master

У меня отлично работает.

Алексей
источник
2

вы можете использовать это

sudo chown -R $USER:$USER "$(git rev-parse --show-toplevel)/.git"
Tấn Tâm
источник
1
Что это делает? Вы можете добавить объяснение?
Anubian Noob
это получит каталог верхнего уровня вашего репо, поэтому команда будет работать независимо от того, где вы сейчас находитесь в репо. Если вы уже в корне, вы можете просто запустить sudo chown -R $ USER: $ USER .git
Tấn Tâm
Измените это в свой вопрос. В противном случае ваш вопрос бесполезен.
Anubian Noob
2
sudo su root

chown -R user:group dir

Каталог - это ваш репозиторий git.

Затем сделайте:

git pull origin master

Вы увидите изменения в коммитах других пользователей.

user3544610
источник
2
 user@M063:/var/www/html/app/.git/objects$ sudo chmod 777 -R .git/objects
 user@M063:/var/www/html/app/.git/objects$ sudo chown -R user:user .git/objects/
Мохд Башир
источник
1

Хорошо - оказывается, это была проблема с разрешениями на GitHub, которая произошла во время вилки emi / bixo на bixo / bixo. Как только Tekkub исправил их, он снова заработал.

kkrugler
источник
что случилось и как вы это исправили? Я знаю, что это было недавно ... есть идеи?
Metagrapher
1
Это была проблема на стороне GitHub - поэтому я не знаю точно, что они сделали, чтобы исправить это, просто «Tekkub» на GitHub сказал: «Я исправил разрешения», и тогда это сработало.
kkrugler 06
Прохладно. Спасибо за информацию. Завел репо заново. Неоптимально, но сработало. Ура!
Metagrapher
4
Мы исправили глюк . Таким образом, он больше не будет получать зарплату, так что все будет само собой разумеющимся.
Алан
1

Поскольку ошибка связана с разрешениями на папку объектов, я сделал chown непосредственно на папке объектов, и у меня это сработало.

n00shie
источник
1

Это работает:

sudo chmod -R gituser.gituser objects
eeepage
источник
1
Нет. chmodИзменяет права доступа к файлам и требует режимов в качестве аргументов, а не пользователей и групп. Это либо, chmod -R ${some_octal_num} blaлибоchown -R ${some_user}:${some_group} bla
Деннис Винтер
1

Думаю, многие вроде меня попадают на подобные форумы, когда возникает описанная выше проблема с git. Однако существует так много причин, которые могут привести к проблеме, что я просто хочу поделиться своими проблемами, чтобы другие узнали, как я уже узнал из вышеизложенного.

У меня есть репозитории на Linux NAS от sitecom (никогда не покупайте NAS от Sitecom, пожалуйста). У меня есть репо, которое клонировано на многих компьютерах, но мне внезапно отказали в отправке. Недавно я установил плагин, чтобы мой NAS мог работать как сервер squeezebox.

Этот сервер сканирует мультимедиа для совместного использования. Чего я не знал, так это того, что, возможно, из-за ошибки, сервер меняет настройки пользователя и группы на squeeze: user для всех файлов, которые он просматривает. И это ВСЕ файлы. Таким образом, изменив права, мне пришлось подтолкнуть.

Сервер ушел, правильные настройки прав были восстановлены, и все работает отлично.

я использовал

chmod -R g+ws *
chown -R <myuser>:<mygroup> *

Если myuser и mygroup off course должны быть заменены правильными настройками для вашей системы. попробуйте git: git или gituser: gituser или что-нибудь еще, что вам может понравиться.,

user2581924
источник
1

Проверьте репозиторий: $ git remote -v

origin  ssh://git@example.com:2283/srv/git/repo.git (fetch)
origin  ssh://git@example.com:2283/srv/git/repo.git (push)

Обратите внимание, что здесь есть подстрока 'git @', она инструктирует git аутентифицироваться как имя пользователя 'git' на удаленном сервере. Если вы опустите эту строку, git будет аутентифицироваться под другим именем пользователя, поэтому возникнет эта ошибка.

Сергей
источник
1

В моем случае между моей машиной и виртуальным сервером git не было единой аутентификации (например, в домене + AD-подобной службе). Поэтому пользователи и группа git являются локальными для виртуального сервера. В моем случае мой удаленный пользователь (который я использую для входа на удаленный сервер) просто не был добавлен в удаленную группу git.

ssh root@<remote_git_server>
usermod -G <remote_git_group> <your_remote_user>

После этого проверьте разрешения, как описано в сообщениях выше ...

Виталий Исаев
источник
1

Вы пробовали sudo git push -u origin --all ? Иногда это единственное, что нужно, чтобы избежать этой проблемы. Он запрашивает у вас системный пароль администратора - тот, который вы можете сделать для входа на свой компьютер - и это то, что вам нужно нажать - или зафиксировать, если это так.

Филипе Фернандес
источник