Ошибка Git Push: недостаточно прав для добавления объекта в базу данных репозитория - PullRequest
538 голосов
/ 23 июня 2011

Когда я пытаюсь нажать на общий удаленный git, я получаю следующую ошибку: insufficient permission for adding an object to repository database

Затем я читаю об исправлении здесь: Fix Это сработало для следующего pushТак как все файлы принадлежали к правильной группе, но в следующий раз, когда кто-то запустил изменение, он сделал новый элемент в папке объектов, в которой в качестве группы была группа по умолчанию.Единственное, о чем я могу думать, это изменить все группы разработчиков по умолчанию для элементов, которые они регистрируют, но это похоже на хак.Есть идеи?Спасибо.

Ответы [ 17 ]

787 голосов
/ 23 июня 2011

Разрешения на восстановление

После того, как вы определили и устранили основную причину (см. Ниже), вам нужно будет исправить разрешения:

cd /path/to/repo.git
sudo chgrp -R groupname .
sudo chmod -R g+rwX .
find . -type d -exec chmod g+s '{}' +

Обратите внимание, если вы хотите, чтобы все былиВ состоянии изменить хранилище, вам не нужно chgrp, и вы захотите изменить chmod на sudo chmod -R a+rwX .

Если вы не исправите основную причину, ошибка продолжит возвращаться, и выВам придется снова и снова запускать вышеуказанные команды.

Основные причины

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

  • Хранилище не настроено для использования в качестве общего хранилища (см. core.sharedRepository в git help config).Если выходные данные:

    git config core.sharedRepository
    

    не group или true или 1 или какой-либо маски, попробуйте выполнить:

    git config core.sharedRepository group
    

    и затем повторно запустить рекурсивныйchmod и chgrp (см. «Разрешения на восстановление» выше).

  • Операционная система не интерпретирует бит setgid для каталогов, поскольку «все новые файлы и подкаталоги должны наследоватьвладелец группы ".

    Когда core.sharedRepository равен true или group, Git использует функцию операционных систем GNU (например, каждый дистрибутив Linux), чтобы гарантировать, что вновь созданные подкаталоги принадлежат правильнымгруппа (группа, в которой находятся все пользователи репозитория).Эта функция описана в документации GNU coreutils :

    ... [Если] установлен бит идентификатора группы-каталога, вновь созданные субфайлы наследуют ту же группу, что икаталог и вновь созданные подкаталоги наследуют бит set-group-ID родительского каталога.... [Этот механизм позволяет] пользователям легче обмениваться файлами, уменьшая необходимость использовать chmod или chown для обмена новыми файлами.

    Однако не все операционные системы имеют эту функцию(NetBSD является одним из примеров).Для этих операционных систем вы должны убедиться, что все ваши пользователи Git имеют одинаковую группу по умолчанию.Кроме того, вы можете сделать репозиторий доступным для записи во всем мире, запустив git config core.sharedRepository world (но будьте осторожны - это менее безопасно).

  • Файловая система не поддерживает бит setgid (например, FAT),ext2, ext3, ext4 все поддерживают бит setgid.Насколько я знаю, файловые системы, которые не поддерживают бит setgid, также не поддерживают концепцию владения группой, поэтому все файлы и каталоги в любом случае будут принадлежать одной и той же группе (какая группа является опцией монтирования).В этом случае убедитесь, что все пользователи Git находятся в группе, которой принадлежат все файлы в файловой системе.
  • Не все пользователи Git находятся в одной группе, которая владеет каталогами репозитория.Убедитесь, что владелец группы в каталогах указан правильно и что все пользователи находятся в этой группе.
390 голосов
/ 21 октября 2011

Для Ubuntu (или любого Linux)

Из корневого каталога проекта

cd .git/objects
ls -al
sudo chown -R yourname:yourgroup *

Вы можете узнать, каким должно быть ваше имя и ваша группа, посмотрев разрешения для большинства выходных данных изта команда ls -al

Примечание: запомните звездочку в конце строки sudo

42 голосов
/ 23 декабря 2015

sudo chmod -R ug+w .;

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

31 голосов
/ 19 февраля 2018

используйте следующую команду, работает как магия

sudo chown -R "${USER:-$(id -un)}" .

введите команду в точности так, как она есть (с лишними пробелами и одной точкой в ​​конце)

27 голосов
/ 14 февраля 2012

Я просто хотел добавить свое решение. У меня было репозиторий на OS X, который владел root-ом в некоторых каталогах, а Home (который является моим пользовательским каталогом) в других, что вызвало ту же ошибку, перечисленную выше.

К счастью, решение было простым. С терминала:

sudo chown -R Home projectdirectory
18 голосов
/ 23 июня 2011

Хороший способ отладки это в следующий раз, когда это произойдет, SSH в удаленном репо, перейдите в папку объектов и выполните ls -al.

Если вы видите 2-3 файла с другим пользователем: владельцем группы, чем это проблема.

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

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

chmod g + s directory-name

Обновление: я не знал о core.sharedRepository. Полезно знать, хотя это, вероятно, только что и выше.

14 голосов
/ 04 сентября 2015

Решено для меня ... только это:

sudo chmod 777 -R .git/objects
9 голосов
/ 05 сентября 2014

Это может легко произойти, если вы запустили git init с пользователем, отличным от того, которого вы планируете использовать при внесении изменений.

Если вы слепо будете следовать инструкциям на [1], это произойдет, когда вывероятно, создал пользователя git как root и затем сразу перешел к git init, не меняя пользователя между ними.

[1] http://git -scm.com / book / en / Git-on-Настройка сервера Настройка сервера

5 голосов
/ 02 декабря 2016

Linux, macOS:

cd .git/
sudo chown -R name:group *

, где name - ваше имя пользователя, а group - группа, к которой принадлежит ваше имя пользователя.

5 голосов
/ 14 февраля 2014

После того, как вы добавите некоторые вещи ... зафиксируйте их и после того, как все закончите, нажмите их!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, выполненному для нового репозитория, в соответствии с документацией это сделает запись в репозиторий группой доступной для записи, выполнив:

$ git config core.sharedRepository group

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

...