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.


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.

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


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).


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.


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

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.


15

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

sudo chmod 777 -R .git/objects

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


7

Linux, macOS:

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

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


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


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.

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.)


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.


1

Möglicherweise haben Sie versehentlich Git-Repositorys verschachtelt


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.



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

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.