Fehler beim Pushing an GitHub - unzureichende Berechtigung zum Hinzufügen eines Objekts zur Repository-Datenbank

126

Ich erhalte einen ungewöhnlichen Fehler, während ich versuche, einen "Git-Push" für mein GitHub-Repository durchzuführen:

Objekte zählen: 8, fertig.
Delta-Komprimierung mit 2 Threads.
Objekte komprimieren: 100% (4/4), fertig.
Objekte schreiben: 100% (5/5), 1,37 KiB, fertig.
Insgesamt 5 (Delta 2), wiederverwendet 0 (Delta 0)
Fehler: Unzureichende Berechtigung zum Hinzufügen eines Objekts zur Repository-Datenbank ./Objekte

fatal: Objekt konnte nicht geschrieben werden
Fehler: Entpack-Objekte mit Fehlercode 128 beendet
Fehler: Entpacken fehlgeschlagen: Entpack-Objekte abnormaler Exit
An [email protected]: bixo / bixo.git
 ! [Remote abgelehnt] Master -> Master (n / a (Entpackerfehler))
Fehler: Einige Refs konnten nicht an '[email protected]: bixo / bixo.git' gesendet werden.
  • Nach einem sauberen Klon von GitHub kann ich eine geänderte Datei bearbeiten / hinzufügen / festschreiben / pushen.
  • Wenn ich dies dann ein zweites Mal wiederhole, erhalte ich den obigen Fehler.
  • Ich kann ganz gut auf andere GitHub-Repositories pushen.
  • Ich habe die Datei- / Verzeichnisberechtigungen auf meiner Seite überprüft und sie scheinen in Ordnung zu sein.
  • Ich verwende Git 1.6.2.3 unter Mac OS X 10.5.8

Das obige Repository war die Quelle meines Spaßes für eine frühere Stack Overflow-Frage ( SO 1904860 ), sodass das GitHub-Repo möglicherweise beschädigt wurde. Das einzige Problem , das ich über ähnliche Suche gefunden habe , war ein auspacken failed Problem auf Github berichtet. Ist schon jemand auf dieses Problem gestoßen, insbesondere wenn GitHub nicht verwendet wird?

kkrugler
quelle
1
Ein weiterer Hinweis für Leute mit diesem Fehler: Ich habe diesen Fehler erhalten, weil ich den falschen Benutzer zum Pushen verwendet habe. Mein Server hat Benutzer foound git; beide können lesen /opt/git/<repo>, aber nur gitschreiben. gitDer Standardwert ist der aktuelle Benutzer, wenn keiner angegeben ist .git/config, was ich vergessen habe. Keine der folgenden ausführlichen Antworten war notwendig.
Sebastian

Antworten:

209

Wenn Sie diesen Fehler außerhalb von Github sehen, finden Sie hier eine Abhilfe.

Erhalten Sie dies von: 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

Danach sollte der Git-Daemon beim Schreiben in .git / Objekte die Gruppendateiberechtigungen verwenden.

syvex
quelle
4
+1 Es hat bei uns funktioniert. Wofür ist das 's' sudo chmod -R g+ws *?
Erik B
5
Dadurch können alle neuen Dateien, die von einem anderen Benutzer erstellt wurden, die Gruppenberechtigungen des Stammverzeichnisses beibehalten. Andernfalls treten Fehler auf, die in das Repository übertragen werden. Siehe setuid und setgid
syvex
Ich habe den gleichen Fehler mit Gitorious unter Debian 6 und PHPStorm IDE mit der Meldung "Fehler: Unzureichende Berechtigung zum Hinzufügen eines Objekts zur Repository-Datenbank .git / objects" erhalten. Ich habe diese Lösung für den übergeordneten Ordner des Projekts verwendet und funktioniert gut mit dem "+ s Trick".
Benj
3
repo-config ist veraltet. Sollte sein git config core.sharedRepository true.
lpapp
4
Hinweis: Wenn Sie den Platzhalter " " verwenden, sind versteckte Dateien und Ordner (wie z. B. .git!) Möglicherweise nicht betroffen! Also , wenn die oben nicht für Sie arbeiten, führen die Befehle für ./.git auch
Ben Rogmans
54

Normalerweise wird dieses Problem durch falsche Benutzer- und Gruppenberechtigungen auf dem Dateisystem Ihres Git-Servers verursacht. Das Git-Repository muss dem Benutzer und auch seiner Gruppe gehören.

Beispiel:

Wenn Ihr Benutzer "git" heißt, ist seine Gruppe "gitgroup" und der Speicherort des Git-Repos: [email protected]: path / to / repo.git

dann mache ein:

sudo chown -R git: gitgroup path / to / repo.git /

Dies hat den Fehler mit der unzureichenden Berechtigung für mich behoben.

Bijan
quelle
chown: ungültiger Benutzer: `git: git '
Alan Coromano
4
@MariusKavansky versuchen Sie $ USER: $ USER anstelle von git: git
dwurf
Dies funktioniert in meinem Fall nur für einige Zeit. Ich muss es nach ein paar Stößen wiederholen.
BuZZ-dEE
Dies ist die beste Antwort, aber Sie sollten sagen, dass Sie das Chown auf ".git / Objekte" beschränken können und der Benutzer, den Sie "git" nennen, nur der Benutzer ist, mit dem Sie angemeldet sind. Die Tatsache, dass der Benutzer dem Git-Server bekannt ist oder nicht, ist nicht wichtig.
Tristan
34
sudo chmod 777 -R .git/objects
Farid Movsumov
quelle
4
Das hat bei mir funktioniert ... aber WTF ?? Ich habe das Repo seit Monaten aktualisiert und dies begann plötzlich heute Nachmittag ...
GojiraDeMonstah
Das Update war für mich fast das gleiche, beinhaltete jedoch das Ändern / Korrigieren des Besitzers einiger Dateien im .git-Verzeichnis. Ich hatte einige Git-Wartungsarbeiten durchgeführt, während ich als 'root' angemeldet war, und dies schien entweder den Besitzer in root geändert zu haben oder einige neue Dateien mit dem Besitzer von root zu erstellen, auf den sich git stützte. Ich hatte ein Auto-Deployment-Skript, das unter dem 'Apache'-Besitzer ausgeführt wurde und dann nicht mehr funktionierte.
Coatesap
9
chmod 777ist niemals eine gute Lösung, sondern nur eine unsichere Problemumgehung. Versuchen Sie stattdessen die Antwort von @ Syvex (mit setgid)
4wk_
10

Das ist mir passiert, als ich es versucht habe git pull. Einige Analysen zeigten, dass sich jemand in der Vergangenheit mit root befasst hatte, wodurch einige Objekte mit root-Besitz erstellt wurden .git/objects.

Also rannte ich

cd <repo>
la .git/objects/

und das zeigte rootBesitz für einige Objekte (Verzeichnisse) wie folgt:

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

Dann rannte ich

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

und es hat funktioniert!

Ich habe natürlich den Benutzer durch meinen echten Benutzer ersetzt.

Thomas
quelle
4

Nichts von alledem hat bei mir funktioniert. Ein paar Stunden später fand ich den Grund für das Problem: Ich verwendete eine Repo-URL des Typs

ssh://[email protected]/~git/repo.git

Leider habe ich eine Kitt-Sitzung mit dem Namen gespeichert, der für example.comdie Anmeldung als Benutzer konfiguriert wurde myOtherUser.

Während ich dachte, dass git example.commit dem Benutzer 'git' eine Verbindung zum Host herstellt , hat Git / TortoiseGit eine Verbindung zu der Kitt-Sitzung hergestellt, example.comdie den Benutzer verwendet myOtherUser. Dies führt zu genau demselben ..insufficient permission..Fehler (da sich beide Benutzer in unterschiedlichen Gruppen befinden).

Lösung: Benennen Sie die Kitt-Sitzung example.comin um[email protected]

Zensursula
quelle
4

chmod sollte chown sein, also ist die richtige Zeile:

sudo chown -R gituser:gituser objects
Rubyan
quelle
3

Seltsamerweise hatte ich dieses Problem bei einem Klon meines Repos, aber nicht bei einem anderen. Abgesehen vom erneuten Klonen des Repos (was ein Mitarbeiter getan hat, um dieses Problem erfolgreich zu umgehen), gelang es mir, einen "Git-Reset" für das Commit durchzuführen, das ich vor Beginn der Fehler hatte. Dann habe ich die Änderungen erneut festgeschrieben und konnte danach erfolgreich pushen. Trotz aller Anzeichen gab es ein Problem auf dem Server, in diesem Fall war es anscheinend ein Hinweis auf eine Kuriosität im lokalen Repo.

dotdotdotPaul
quelle
3

Ich habe diesen Fehler erhalten, weil jedes Mal, wenn ein Benutzer Inhalte pusht, die Gruppe der Datei in den Benutzer geändert wurde. Wenn dann ein anderer Benutzer versuchte, in das Repository zu pushen, verursachte dies einen Berechtigungsfehler und der Push wurde abgelehnt. Sie müssen also Ihren Systemadministrator bitten, die Einstellungen des Repositorys zu ändern, damit die Gruppe einer Datei im Repository für keinen Push durch einen Benutzer geändert wird.

Um ein solches Problem zu vermeiden, stellen Sie bitte sicher, dass Sie beim Initialisieren Ihres Git-Repositorys den Befehl "git init --shared = group" verwenden.

Arun Chaudhary
quelle
Weitere Erklärungen finden Sie unter dem Link stackoverflow.com/questions/16183345/…
Arun Chaudhary
2

Wenn dieser Fehler später nach dem Festlegen der Berechtigungen weiterhin auftritt, müssen Sie möglicherweise Ihre Erstellungsmaske ändern. Wir haben festgestellt, dass unsere neuen Commits (Ordner unter Objekten) immer noch ohne Gruppenschreibberechtigung erstellt wurden, sodass nur die Person, die sie festgeschrieben hat, in das Repository pushen konnte.

Wir haben dies behoben, indem wir die Umask der SSH-Benutzer auf 002 mit einer geeigneten Gruppe gesetzt haben, die von allen Benutzern gemeinsam genutzt wird.

z.B

umask 002

Dabei erlaubt die mittlere 0 standardmäßig das Schreiben von Gruppen.

Scipilot
quelle
Sind Sie sicher, dass es einen solchen Befehl unter Unix oder Linux gibt? Weil ich mir ziemlich sicher bin, dass umask nicht ortsspezifisch ist.
Jan Hudec
Ja, es tut mir leid, dass Sie Recht haben. Ich weiß nicht, warum ich dachte, es hätte einen zusätzlichen Verzeichnisparameter. Es gilt einfach für den Benutzer. Ich habe den Kommentar aktualisiert.
Scipilot
2

Nachdem Sie einige Dinge hinzugefügt haben ... legen Sie sie fest und schieben Sie sie schließlich! KNALL!! Starten Sie alle Probleme ... Wie Sie beachten sollten, gibt es einige Unterschiede in der Art und Weise, wie neue und vorhandene Projekte definiert wurden. Wenn eine andere Person versucht, dieselben Dateien oder Inhalte hinzuzufügen / festzuschreiben / zu pushen (git behält beide als dieselben Objekte bei), tritt der folgende Fehler auf:

$ 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

Um dieses Problem zu lösen, müssen Sie das Berechtigungssystem des Betriebssystems berücksichtigen, da Sie in diesem Fall dadurch eingeschränkt sind. Um das Problem besser zu verstehen, überprüfen Sie den Ordner Ihres Git-Objekts (.git / Objekte). Sie werden wahrscheinlich so etwas sehen:

<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

* Beachten Sie, dass die Berechtigungen dieser Datei nur für Ihre Benutzer erteilt wurden. Niemand wird sie niemals ändern können ... *

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

LÖSUNG DES PROBLEMS

Wenn Sie über eine Superuser-Berechtigung verfügen, können Sie alle Berechtigungen mithilfe von Schritt 2 selbst ändern. In jedem anderen Fall müssen Sie alle Benutzer mit Objekten, die mit ihren Benutzern erstellt wurden, fragen. Verwenden Sie den folgenden Befehl, um zu erfahren, wer sie sind ::

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

Jetzt müssen Sie und alle Benutzer des Dateibesitzers die Berechtigung für diese Dateien ändern.

$ chmod -R 774 .

Danach müssen Sie eine neue Eigenschaft hinzufügen, die --shared = group entspricht, die für das neue Repository erstellt wurde. Gemäß der Dokumentation wird das Repository für die Gruppe beschreibbar. Führen Sie Folgendes aus:

$ git config core.sharedRepository group

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

helmedeiros
quelle
2

Versuchen Sie Folgendes zu tun:

Gehen Sie zu Ihrem Server

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

Gehen Sie dann zu Ihrer Arbeitskopie (lokales Repository) und packen Sie sie um git repack master

Funktioniert perfekt für mich.

Aleksei
quelle
2

Sie können dies verwenden

sudo chown -R $USER:$USER "$(git rev-parse --show-toplevel)/.git"
Tấn Tâm
quelle
1
Was macht das? Können Sie eine Erklärung hinzufügen?
Anubian Noob
Dadurch wird das oberste Verzeichnis Ihres Repos abgerufen, sodass der Befehl unabhängig davon funktioniert, wo in Ihrem Repo Sie sich gerade befinden. Wenn Sie bereits in der Wurzel sind, können Sie einfach sudo chown -R $ USER: $ USER .git
Tấn Tâm
Bearbeiten Sie es in Ihre Frage. Ansonsten ist deine Frage ziemlich nutzlos.
Anubian Noob
2
sudo su root

chown -R user:group dir

Das dir ist dein Git Repo.

Dann mach:

git pull origin master

Sie werden Änderungen an Commits anderer sehen.

user3544610
quelle
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/
Mohd Bashir
quelle
1

OK - es stellte sich heraus, dass es sich um ein Berechtigungsproblem auf GitHub handelte, das während der Verzweigung von emi / bixo zu bixo / bixo aufgetreten ist. Sobald Tekkub diese behoben hatte, funktionierte es wieder.

kkrugler
quelle
Was ist passiert und wie haben Sie das Problem behoben? Ich weiß, es ist eine Weile her ... irgendwelche Ideen?
Metagrapher
1
Es war ein Problem auf GitHubs Seite - daher weiß ich nicht genau, was sie getan haben, um es zu beheben, nur dass "Tekkub" bei GitHub sagte "Ich habe die Berechtigungen behoben" und dann funktionierte es.
kkrugler
Cool. Danke für die Information. Ich habe das Repo neu geklont. Suboptimal, aber es hat funktioniert. Prost!
Metagrapher
4
Wir, äh, fixierten wir die Panne . Er wird also keinen Gehaltsscheck mehr erhalten, also klappt es ganz natürlich von selbst.
Alan
1

Da sich der Fehler auf Berechtigungen für den Objektordner bezieht, habe ich einen Chown direkt für den Objektordner durchgeführt und es hat bei mir funktioniert.

n00shie
quelle
1

Das funktioniert:

sudo chmod -R gituser.gituser objects
eeepage
quelle
1
Nein. chmodÄndert die Dateiberechtigungen und benötigt Modi als Argumente, nicht Benutzer und Gruppen. Es ist entweder chmod -R ${some_octal_num} blaoderchown -R ${some_user}:${some_group} bla
Dennis Winter
1

Ich denke, viele wie ich landen in solchen Foren, wenn das oben beschriebene Git-Problem auftritt. Es gibt jedoch so viele Ursachen, die zu dem Problem führen können, dass ich nur mitteilen möchte, was meine Probleme verursacht hat, damit andere lernen können, wie ich bereits von oben gelernt habe.

Ich habe meine Repos auf einem Linux-NAS von sitecom (Kaufen Sie niemals NAS von Sitecom, pleeaaase). Ich habe hier ein Repo, das auf vielen Computern geklont ist, auf das ich aber plötzlich keinen Push mehr hatte. Kürzlich habe ich ein Plugin installiert, damit mein NAS als Squeezebox-Server fungieren kann.

Dieser Server sucht nach Medien, die freigegeben werden sollen. Was ich nicht wusste, war, dass der Server aufgrund eines Fehlers die Benutzer- und Gruppeneinstellung so ändert, dass sie "Squeeze: User" für alle Dateien enthält, in die er schaut. Und das sind ALLE Dateien. So änderte ich die Rechte, die ich pushen musste.

Der Server ist weg und die richtigen Rechteeinstellungen werden wiederhergestellt und alles funktioniert einwandfrei.

ich benutzte

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

Wo Myuser und Mygroup vom Kurs abweichen müssen, müssen die richtigen Einstellungen für Ihr System vorgenommen werden. versuche git: git oder gituser: gituser oder etwas anderes, das dir gefallen könnte.,

user2581924
quelle
1

Überprüfen Sie das Repository: $ git remote -v

origin  ssh://[email protected]:2283/srv/git/repo.git (fetch)
origin  ssh://[email protected]:2283/srv/git/repo.git (push)

Beachten Sie, dass es hier einen 'git @' - Teilstring gibt, der git anweist, sich auf dem Remote-Server als Benutzername 'git' zu authentifizieren. Wenn Sie diese Zeile weglassen, wird git unter einem anderen Benutzernamen authentifiziert, daher tritt dieser Fehler auf.

Sergey
quelle
1

In meinem Fall gab es keine einheitliche Authentifizierung (z. B. innerhalb der Domäne + AD-ähnlicher Dienst) zwischen meinem Computer und dem virtuellen Git-Server. Daher sind Git-Benutzer und -Gruppen für den virtuellen Server lokal. In meinem Fall wurde mein Remote-Benutzer (mit dem ich mich beim Remote-Server anmelde) einfach nicht zur Remote-Git-Gruppe hinzugefügt.

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

Überprüfen Sie anschließend die Berechtigungen, wie in den obigen Beiträgen beschrieben ...

Vitaly Isaev
quelle
1

Haben Sie versucht, sudo git push -u origin --all ? Manchmal ist es das einzige, was Sie brauchen, um dieses Problem zu vermeiden. Sie werden nach dem Kennwort des Administratorsystems gefragt - das Kennwort, mit dem Sie sich bei Ihrem Computer anmelden können - und das müssen Sie pushen - oder festschreiben, wenn dies der Fall ist.

Filipe Fernandes
quelle