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.
git add
undgit commit
-ing als Root-Benutzer erhalten. Ich habe es mit agit reset
und der Antwort dieser Frage behoben , um die.git
Verzeichnisberechtigungen zu korrigieren.Antworten:
Reparaturberechtigungen
Nachdem Sie die zugrunde liegende Ursache identifiziert und behoben haben (siehe unten), möchten Sie die Berechtigungen reparieren:
Hinweis: Wenn Sie möchten, dass jeder das Repository ändern kann, benötigen Sie das nicht
chgrp
und 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.sharedRepository
ingit help config
). Wenn die Ausgabe von:ist nicht
group
odertrue
oder1
oder eine Maske, versuchen Sie zu laufen:Führen Sie dann das rekursive
chmod
und erneut auschgrp
(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.sharedRepository
isttrue
odergroup
, 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 :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).quelle
false
oderumask
). Siehegit help config
für weitere Details.git push
mit 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.X
, nicht um Kleinbuchstabenx
. Ein GroßbuchstabeX
bedeutet "gesetzt,S_IXGRP
wenn die Datei ein Verzeichnis ist (oder wenn ein anderesS_IX*
Bit gesetzt ist)", sodass nicht alle Dateien ausführbar sind. Es kann unnötig sein, aber vielleicht auch nicht, wenncore.sharedRepository
es0600
irgendwann in der Vergangenheit eingestellt wurde.Für Ubuntu (oder jedes Linux)
Aus dem Projektstamm,
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
quelle
Sorry, user myuser is not allowed to execute '/bin/chown
*
machte den Unterschied. Vielen Dank.ls .git
Verwenden Sie den folgenden Befehl, funktioniert wie Magie
Geben Sie den Befehl genau so ein, wie er ist (mit zusätzlichen Leerzeichen und einem Punkt am Ende).
quelle
sudo chmod -R ug+w .;
Grundsätzlich verfügt die
.git/objects
Datei nicht über Schreibberechtigungen. Die obige Zeile gewährt allen Dateien und Ordnern im Verzeichnis die Berechtigung.quelle
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:
quelle
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
chgrp
denobjects
Ordner und seinen Inhalt, damit der Gruppeneigentum die gemeinsam genutztegit
Gruppe ist.Sie sollten dem Ordner auch ein Sticky-Bit hinzufügen, damit alle im Ordner erstellten Dateien immer die Gruppe von haben
git
.Update: Ich wusste nichts über core.sharedRepository. Gut zu wissen, obwohl es wahrscheinlich nur das oben genannte tut.
quelle
Für mich gelöst ... genau das:
quelle
Chmod 777
wird nicht empfohlen, da dadurch Ihre gesamte Datei dem Rest der Weltchmod 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.Dies kann leicht passieren, wenn Sie
git init
mit 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
quelle
Linux, macOS:
Wo
name
ist Ihr Benutzername undgroup
ist die Gruppe, zu der Ihr Benutzername gehört?quelle
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:
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:
* Beachten Sie, dass die Berechtigungen dieser Datei nur für Ihre Benutzer erteilt wurden. Niemand kann sie ändern ... *
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 ::
Jetzt müssen Sie und alle Benutzer des Dateibesitzers die Berechtigung für diese Dateien ändern.
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:
https://coderwall.com/p/8b3ksg
quelle
username:groupname
für mich, aber als ich es versuchtechmod -R 774 .
, konnte ich danngit add --all
erfolgreich laufen .Für meinen Fall hat keiner der Vorschläge funktioniert. Ich bin unter Windows und das hat bei mir funktioniert:
git remote add foo //SERVERNAME/path/to/copied/git
)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.quelle
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.
(Ich bezweifle, dass andere ihre inetd conf-Datei git-gpv aufrufen. Normalerweise befindet sie sich direkt in /etc/inetd.conf.)
quelle
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.
quelle
Möglicherweise haben Sie versehentlich Git-Repositorys verschachtelt
quelle
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 werden
origin
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
origin
und die anderen benennen sie beispielsweise vonorigin
bis umanotherorigin
. Denken Sie daran, dass dies nur Aliase sind und Sie sich nur an die neuen Aliase und ihre jeweiligen Remote-Zweige erinnern müssen.quelle
Funktioniert bei mir
quelle
Ich habe das bekommen, als ich in ein Rstudio-Projekt gezogen bin. Mir wurde klar, dass ich vergessen hatte:
beim Programmstart. Da es einen weiteren Fehler gibt, den ich habe, muss ich tatsächlich Folgendes tun:
quelle
Verwenden Sie sudo für commit -m
quelle
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
~/.smbcredentials
Datei.quelle