Git Push-Fehler: Unzureichende Berechtigung zum Hinzufügen eines Objekts zur Repository-Datenbank

591

Wenn ich versuche, auf eine gemeinsam genutzte Git-Fernbedienung zu pushen, wird der folgende Fehler angezeigt: insufficient permission for adding an object to repository database

Dann las ich hier über einen Fix: Fix Dies funktionierte für den nächsten Push, da alle Dateien der richtigen Gruppe angehörten, aber wenn jemand das nächste Mal eine Änderung vorschob, wurde ein neues Element im Objektordner erstellt, das seine Standardgruppe hatte als die Gruppe. Das einzige, woran ich denken kann, ist, die gesamte Standardgruppe des Entwicklers für Elemente zu ändern, die er eincheckt, aber das scheint ein Hack zu sein. Irgendwelche Ideen? Vielen Dank.

skaz
quelle
Ich habe diesen Fehler nach versehentlichem git addund git commit-ing als Root-Benutzer erhalten. Ich habe es mit a git resetund der Antwort dieser Frage behoben , um die .gitVerzeichnisberechtigungen zu korrigieren.
StockB
Wie kann ich herausfinden, welches Objekt erstellt werden soll (beim manuellen Debuggen solcher Berechtigungsprobleme)? Die Fehlermeldung ist viel zu vage.
Mirabilos
Ich habe diesen Fehler beim Kopieren und Einfügen einer anderen .git-Datei zuerst mit sudo erhalten. Daher hatten Dateien sudo sudo als Namen und Gruppe.
Vincent

Antworten:

864

Reparaturberechtigungen

Nachdem Sie die zugrunde liegende Ursache identifiziert und behoben haben (siehe unten), möchten Sie die Berechtigungen reparieren:

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

Hinweis: Wenn Sie möchten, dass jeder das Repository ändern kann, benötigen Sie das nicht chgrpund Sie möchten das chmod in ändernsudo chmod -R a+rwX .

Wenn Sie die zugrunde liegende Ursache nicht beheben, tritt der Fehler immer wieder auf und Sie müssen die obigen Befehle immer wieder ausführen.

Zugrunde liegenden Ursachen

Der Fehler kann durch eine der folgenden Ursachen verursacht werden:

  • Das Repository ist nicht als freigegebenes Repository konfiguriert (siehe core.sharedRepositoryin git help config). Wenn die Ausgabe von:

    git config core.sharedRepository
    

    ist nicht groupoder trueoder 1oder eine Maske, versuchen Sie zu laufen:

    git config core.sharedRepository group
    

    Führen Sie dann das rekursive chmodund erneut aus chgrp(siehe "Reparaturberechtigungen" oben).

  • Das Betriebssystem interpretiert ein Setgid-Bit in Verzeichnissen nicht als "Alle neuen Dateien und Unterverzeichnisse sollten den Gruppeneigentümer erben".

    Wann core.sharedRepositoryist trueoder group, Git stützt sich auf eine Funktion von GNU-Betriebssystemen (z. B. jede Linux-Distribution), um sicherzustellen, dass neu erstellte Unterverzeichnisse der richtigen Gruppe gehören (der Gruppe, in der sich alle Benutzer des Repositorys befinden). Diese Funktion ist in der Dokumentation zu GNU coreutils dokumentiert :

    ... [Wenn] das Set-Group-ID-Bit eines Verzeichnisses gesetzt ist, erben neu erstellte Unterdateien dieselbe Gruppe wie das Verzeichnis, und neu erstellte Unterverzeichnisse erben das Set-Group-ID-Bit des übergeordneten Verzeichnisses. ... [Mit diesem Mechanismus] können Benutzer Dateien einfacher freigeben, indem sie weniger neue Dateien verwenden chmododer freigeben müssen chown.

    Allerdings verfügen nicht alle Betriebssysteme über diese Funktion (NetBSD ist ein Beispiel). Für diese Betriebssysteme sollten Sie sicherstellen, dass alle Ihre Git-Benutzer dieselbe Standardgruppe haben. Alternativ können Sie das Repository durch Ausführen weltweit beschreibbar machen git config core.sharedRepository world(aber seien Sie vorsichtig - dies ist weniger sicher).

  • Das Dateisystem unterstützt das setgid-Bit (z. B. FAT) nicht. ext2, ext3, ext4 unterstützen alle das setgid-Bit. Soweit ich weiß, unterstützen die Dateisysteme, die das setgid-Bit nicht unterstützen, auch nicht das Konzept des Gruppenbesitzes, sodass alle Dateien und Verzeichnisse ohnehin derselben Gruppe gehören (welche Gruppe eine Mount-Option ist). Stellen Sie in diesem Fall sicher, dass sich alle Git-Benutzer in der Gruppe befinden, der alle Dateien im Dateisystem gehören.
  • Nicht alle Git-Benutzer gehören derselben Gruppe an, der die Repository-Verzeichnisse gehören. Stellen Sie sicher, dass der Gruppeneigentümer in den Verzeichnissen korrekt ist und dass sich alle Benutzer in dieser Gruppe befinden.
Richard Hansen
quelle
1
@ Richard Hansen - Ich weiß nicht wirklich, was du meinst, wenn du den Besitz erzwingst. Ich schaue den Mann nach chmod an, weiß aber nicht genug darüber, damit die Worte Sinn ergeben :) Irgendwelche Tipps?
Skaz
7
@GiH: Sie erhalten nichts, wenn es nicht gesetzt ist (was dasselbe ist wie falseoder umask). Siehe git help configfür weitere Details.
Richard Hansen
10
Ich muss git pushmit dem Root- Konto in meinem Arbeitsverzeichnis ausgestellt haben. Ich fand, dass der Besitzer einiger Git-Repository-Dateien laut dieser Antwort root ( -r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424) ist.
LiuYan 研 研
3
@ MattBrowne: Beachten Sie, dass es sich um ein Großbuchstaben handelt X, nicht um Kleinbuchstaben x. Ein Großbuchstabe Xbedeutet "gesetzt, S_IXGRPwenn die Datei ein Verzeichnis ist (oder wenn ein anderes S_IX*Bit gesetzt ist)", sodass nicht alle Dateien ausführbar sind. Es kann unnötig sein, aber vielleicht auch nicht, wenn core.sharedRepositoryes 0600irgendwann in der Vergangenheit eingestellt wurde.
Richard Hansen
2
@francoisromain: Diese Zeile setzt das setgid-Bit in allen Verzeichnissen. Siehe gnu.org/software/coreutils/manual/html_node/…
Richard Hansen
440

Für Ubuntu (oder jedes Linux)

Aus dem Projektstamm,

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

Sie können feststellen, wie Ihr Name und Ihre Gruppe lauten sollen, indem Sie sich die Berechtigungen für den Großteil der Ausgabe dieses Befehls ls -al ansehen

Hinweis: Denken Sie an den Stern am Ende der Sudo-Linie

TerryS
quelle
7
Hat super funktioniert! Ja, aus irgendeinem Grund wurde einigen Ordnern ein anderer Name und eine andere Gruppe (root) zugewiesen.
Peter Arandorenko
2
Ich bekomme:Sorry, user myuser is not allowed to execute '/bin/chown
Francisco Corrales Morales
Das *machte den Unterschied. Vielen Dank.
Bradley Flood
5
Mein Problem war, dass ich einmal einen "Git Pull" als Root gemacht hatte, was meiner Meinung nach die Berechtigungen vermasselt hat ... Sie können dies überprüfen, indem Sie einls .git
Rogerdpack
Danke für eine schnelle Lösung!
Helvete
74

Verwenden Sie den folgenden Befehl, funktioniert wie Magie

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

Geben Sie den Befehl genau so ein, wie er ist (mit zusätzlichen Leerzeichen und einem Punkt am Ende).

Code_Worm
quelle
6
Klappt wunderbar!
Doncadavona
1
genial! funktionierte perfekt auf meinem Mac
Sachin Khot
Das hat mir auch geholfen! Vielen Dank.
Horvath Adam
In der Tat wie Magie gearbeitet! Vielen Dank!
Kumar Manish
49

sudo chmod -R ug+w .;

Grundsätzlich verfügt die .git/objectsDatei nicht über Schreibberechtigungen. Die obige Zeile gewährt allen Dateien und Ordnern im Verzeichnis die Berechtigung.

Rajendra Kumar Vankadari
quelle
2
Das hat bei mir funktioniert. Die akzeptierte Antwort tat es leider nicht. Danke Rajendra!
Revelt
27

Ich wollte nur meine Lösung hinzufügen. Ich hatte ein Repo unter OS X, das in einigen Verzeichnissen den Besitz von root und in anderen von Home (das ist mein Benutzerverzeichnis) besaß, was denselben oben aufgeführten Fehler verursachte.

Die Lösung war zum Glück einfach. Vom Terminal:

sudo chown -R Home projectdirectory
Brandon
quelle
Das gleiche ist mir passiert. Ich kann nicht herausfinden, wie einige der Objekte Root-Besitz erlangt haben, aber sie haben es getan.
vy32
18

Ein guter Weg, um dies zu debuggen, ist das nächste Mal, wenn SSH in das Remote-Repo, CD in den Objektordner und eine ls -al .

Wenn Sie 2-3 Dateien mit einem anderen Benutzer sehen: Gruppenbesitz als dies ist das Problem.

Es ist mir in der Vergangenheit passiert, dass einige ältere Skripte auf unser Git-Repo zugreifen und normalerweise bedeuten, dass ein anderer (Unix-) Benutzer zuletzt Dateien gepusht / geändert hat und Ihr Benutzer keine Berechtigung zum Überschreiben dieser Dateien hat. Sie sollten eine gemeinsam genutzte Git-Gruppe erstellen, in der sich alle git-fähigen Benutzer befinden, und dann rekursiv chgrpden objectsOrdner und seinen Inhalt, damit der Gruppeneigentum die gemeinsam genutzte gitGruppe ist.

Sie sollten dem Ordner auch ein Sticky-Bit hinzufügen, damit alle im Ordner erstellten Dateien immer die Gruppe von haben git.

chmod g + s Verzeichnisname

Update: Ich wusste nichts über core.sharedRepository. Gut zu wissen, obwohl es wahrscheinlich nur das oben genannte tut.

Mauvis Ledford
quelle
15

Für mich gelöst ... genau das:

sudo chmod 777 -R .git/objects
GUSTAVO BERBERT
quelle
21
Chmod 777wird nicht empfohlen, da dadurch Ihre gesamte Datei dem Rest der Welt
Elena,
23
Wenn Ihr Rat lautet chmod 777, verstehen Sie das Problem 99 Mal von 100 nicht und verursachen wahrscheinlich mehr Probleme, als Sie bei der Lösung helfen. Wie die oben akzeptierte Antwort zeigt, ist dieses Problem nicht anders.
Jonatan
Warum schlagen Sie keine akzeptable Antwort vor, sondern sagen, dass dies eine falsche Wahl ist?
Giovani
2
Denn obwohl es auf der Seite akzeptable Antworten gibt, ist diese inakzeptable Antwort immer noch hier.
JoE
sudo chmod -R 777 .git / Objekte
Nabeel Ahmed
9

Dies kann leicht passieren, wenn Sie git initmit einem anderen Benutzer als dem ausgeführt haben, den Sie beim Übertragen von Änderungen verwenden möchten.

Wenn Sie den Anweisungen auf [1] blind folgen, geschieht dies, da Sie wahrscheinlich den Git-Benutzer als Root erstellt und dann sofort zu Git Init gewechselt haben, ohne den Benutzer dazwischen zu wechseln.

[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server

gitzor
quelle
7

Linux, macOS:

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

Wo nameist Ihr Benutzername und groupist die Gruppe, zu der Ihr Benutzername gehört?

Afshin Mehrabani
quelle
5

Nachdem Sie einige Dinge hinzugefügt haben ... legen Sie sie fest und schieben Sie sie schließlich! KNALL!! Starten Sie alle Probleme ... Wie Sie bemerken sollten, gibt es einige Unterschiede in der Art und Weise, wie sowohl neue als auch 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 werden. 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 kann sie ändern ... *

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
Ich hatte alle das gleiche username:groupnamefür mich, aber als ich es versuchte chmod -R 774 ., konnte ich dann git add --allerfolgreich laufen .
John Skilbeck
3

Für meinen Fall hat keiner der Vorschläge funktioniert. Ich bin unter Windows und das hat bei mir funktioniert:

  • Kopieren Sie das Remote-Repo in einen anderen Ordner
  • Geben Sie den Ordner frei und erteilen Sie die entsprechenden Berechtigungen.
  • Stellen Sie sicher, dass Sie von Ihrem lokalen Computer aus auf den Ordner zugreifen können.
  • Fügen Sie dieses Repo als ein weiteres Remote-Repo in Ihr lokales Repo ein. ( git remote add foo //SERVERNAME/path/to/copied/git)
  • Schieben Sie zu foo. git push foo master. Hat es funktioniert? Großartig! Löschen Sie nun das nicht funktionierende Repo und benennen Sie es in das vorhergehende um. Stellen Sie sicher, dass die Berechtigungen und Freigabeeigenschaften gleich bleiben.
Halil Kaskavalci
quelle
1
In meinem Fall wurden die Berechtigungsprobleme behoben, indem einfach der lokale Ordner in einen neuen Ordner kopiert, der alte gelöscht und der neue in den alten Namen umbenannt wurde.
mgiuffrida
2

Ich habe das gleiche Problem getroffen. Als ich hier herumlas, wurde mir klar, dass es sich um Dateiberechtigungen handelte, auf die sich die Nachricht bezog. Die Lösung war für mich in:

/etc/inetd.d/git-gpv

Es wurde git-daemon gestartet, als der Benutzer ' Nobody ' die Schreibberechtigung fehlte.

# Who   When    What
# GPV   20Nov13 Created this by hand while reading: http://linuxclues.blogspot.co.uk/2013/06>/git-daemon-ssh-create-repository-debian.html
# GPV   20Nov13 Changed owner (to user_git) otherise nobody lack permission to update the repository
#git stream tcp nowait nobody  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo
git stream tcp nowait user_git  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo

(Ich bezweifle, dass andere ihre inetd conf-Datei git-gpv aufrufen. Normalerweise befindet sie sich direkt in /etc/inetd.conf.)

GraemeV
quelle
1

Sie benötigen die ausreichenden Schreibberechtigungen für das Verzeichnis, in das Sie pushen.

In meinem Fall: Windows 2008 Server

Klicken Sie mit der rechten Maustaste auf das Git-Repo-Verzeichnis oder das übergeordnete Verzeichnis.

Eigenschaften> Registerkarte "Freigabe"> Erweiterte Freigabe> Berechtigungen> Stellen Sie sicher, dass der Benutzer über die entsprechenden Zugriffsrechte verfügt.

Fuyu Persimmon
quelle
1

Möglicherweise haben Sie versehentlich Git-Repositorys verschachtelt

IliasT
quelle
1

Es besteht auch die Möglichkeit, dass Sie ein weiteres lokales Repository mit demselben Alias ​​hinzugefügt haben. Als Beispiel haben Sie jetzt 2 lokale Ordner, die als bezeichnet werdenorigin werden. Wenn Sie versuchen zu pushen, akzeptiert das Remote-Repository Ihre Anmeldeinformationen nicht.

Benennen Sie die lokalen Repository-Aliase um. Sie können diesem Link folgen https://stackoverflow.com/a/26651835/2270348

Vielleicht können Sie 1 lokales Repository Ihrer Wahl als belassen originund die anderen benennen sie beispielsweise von originbis um anotherorigin. Denken Sie daran, dass dies nur Aliase sind und Sie sich nur an die neuen Aliase und ihre jeweiligen Remote-Zweige erinnern müssen.

Huey Mataruse
quelle
0

Funktioniert bei mir

sudo chmod -R g+rwX .
Nitin.
quelle
0

Ich habe das bekommen, als ich in ein Rstudio-Projekt gezogen bin. Mir wurde klar, dass ich vergessen hatte:

sudo rstudio

beim Programmstart. Da es einen weiteren Fehler gibt, den ich habe, muss ich tatsächlich Folgendes tun:

sudo rstudio --no-sandbox
Timothy Pollington
quelle
0

Verwenden Sie sudo für commit -m

  • git add -A
  • sudo git commit -m "Verwenden Sie sudo für commit -m"
  • git push origin branch_name
oparam
quelle
0

Ich habe dieses Problem mit einem Remote-Repository auf einer Samba-Freigabe erhalten. Ich habe erfolgreich von dieser Fernbedienung gezogen, aber beim Drücken darauf gescheitert.

Die Ursache des Fehlers waren falsche Anmeldeinformationen in meiner ~/.smbcredentialsDatei.

Josh
quelle