Ich bin auf einem geklonten Repo und versuche, in meinen Remote-Zweig zu pushen. Das Committing funktioniert einwandfrei, aber jedes Mal, wenn ich versuche zu pushen, erhalte ich Folgendes:
error: unable to write file ./objects/foo/bar: Permission denied
Ich bin Eigentümer aller Dateien im lokalen Repository und normalerweise funktioniert das Pushen problemlos. Nach einiger Zeit tritt jedoch dieser Fehler auf und ich kann nicht pushen.
Die einzige Möglichkeit, das Problem zu lösen, besteht darin, zum letzten Commit am Ursprungsort zurückzukehren und zu versuchen, die Datei zu finden, die vermutlich das Problem verursacht.
Ich berühre dann eine neue Datei und füge den Inhalt aus der alten „defekten“ Datei ein. Manchmal hilft das auch nicht und ist offensichtlich kein praktikabler Workaround.
Antwort1
Ich bin auf dieses Problem gestoßen und habe diese Frage gefunden. Ich habe den Tipp gelesen, der unter gepostet wurdehttps://www.thegeekstuff.com/2017/05/git-push-error/und fasse zusammen, was das Problem (für mich) behoben hat.
Die Lösung bestand darin, den Host, auf dem sich das GIT REPO befand, so zu konfigurieren, dass er eine gemeinsame Gruppe enthielt, zu der alle Git-Benutzer hinzugefügt wurden. Zum Beispiel /etc/group
git:x:4001:user1,user2
Führen Sie als Nächstes auf dem Host, auf dem sich das Git-Repository befindet, die folgenden Befehle aus:
cd /local/git-repos/repo1.git
sudo chgrp -R git objects
sudo chmod -R g+rws objects
Für mich war das Problem damit behoben. Der referenzierte Artikel erklärt mehr über die Konfiguration eines Repo als Shared Repo, aber ich habe das (noch) nicht gemacht.
git config core.sharedRepository group
Warum kann das passieren? Wenn Sie interessiert sind, lesen Sie weiter.
Warum passiert das
Bei mir ist das passiert, als ich ein privates Git-Repo eingerichtet habe, das ich (Benutzer1) mit einigen Kollegen geteilt habe. Das Repo befand sich auf meinem Host (sagen wir Host1) und wurde auch von Benutzer2@Host2 verwendet.
Nachfolgend sind die Schritte aufgeführt, die ich zur Einrichtung verwendet habe, und an der entsprechenden Stelle erkläre ich, wo das Problem auftritt.
Ich bin Benutzer1@Host1 und erstelle ein einfaches Git-Repository mit:
mkdir /local/git-repos cd /local/git-repos git init --bare repo1.git
Ich habe eine Datei ~/.ssh/config eingerichtet, sodass der für das Git-Repository verwendete Name ein logischer Name ist. Dies geschieht, damit ich, wenn ich meine Box auf einen anderen Computer verschiebe, nur meinen Host-Alias auf den neuen Computernamen aktualisieren muss.
Datei:
$HOME/.ssh/config
Host mygithost HostName host1
Ich klone dann das Repo mit
cd $HOME git clone mygithost:/local/git-repos/repo1.git cd repo1 # Add files and use normal git commands git add -u . git commit git push
Die Updates werden an das Git-Repository auf dem Computer gesendet
Richten Sie Benutzer2 ein, damit er auf dasselbe GIT-Repository zugreifen kann
- Sie müssen die Datei $HOME/.ssh/config wie für Benutzer1 einrichten.
- Stellen Sie sicher, dass der Benutzer als er selbst per SSH auf Host1 zugreift.
ssh user2@mygithost echo it worked cd $HOME git clone mygithost:/local/git-repos/repo1.git
An diesem Punkt können beide Benutzer, Benutzer1 und Benutzer2, auf das freigegebene GIT-Repository zugreifen.
WennBEIDEBenutzer führen Commits durch, dann enthalten die Git-REPO-Objektdateien einige Dateien, die im Besitz von sind,
user1
und einige Dateien, die im Besitz von sinduser2
. Das Problem besteht darin, dass später beimuser1
Versuch, Dateien auf den GIT-HOST zu übertragen, dieobject
erstellten Dateien und Verzeichnisse möglicherweise im Besitz von sind,user2
sodass der folgende Fehler auftritt.error: insufficient permission for adding an object to repository database ./objects fatal: failed to write object error: unpack failed: unpack-objects abnormal exit ! [remote rejected] master -> master (n/a (unpacker error)) error: failed to push some refs to [email protected]:/home/git/myproj
Die Lösung besteht darin, das Git Bare Repo so zu konfigurieren, dass jeder Benutzer von anderen Benutzern erstellte Dateien lesen/schreiben kann. Dies geschieht im nächsten Schritt mithilfe
UNIX GROUP
von Berechtigungen.Richten Sie das REPO so ein, dass verschiedene Benutzer auf das Git-Repo zugreifen können.
Erstellen Sie eine GRUPPE, der alle Benutzer angehören können
sudo vi /etc/group git:x:4001:user1,user2
Ändern Sie alle Dateien, sodass sie sich ordnungsgemäß in der neu erstellten Gruppe befinden.
cd /local/git-repos/repo1.git sudo chgrp -R git objects sudo chmod -R g+rws objects
Verwenden Sie die freigegebene Gruppe, die Sie oben erstellt haben (
git
in diesem Beispiel).
HINWEIS: Das Group-Suid-Bit ist wichtig, da es dafür sorgt, dass zukünftige Dateien/Verzeichnisse, die erstellt werden, die gleichen Einstellungen wie das übergeordnete Verzeichnis beibehalten. Vonhttps://www.redhat.com/sysadmin/suid-sgid-sticky-bit, es sagt:
Wenn diese Option für ein Verzeichnis festgelegt ist, wird für alle im Verzeichnis erstellten Dateien der Gruppenbesitz auf den des Verzeichniseigentümers festgelegt.
Zusammenfassung
Dieser Fehler sollte normalerweise bei keinem normal gehosteten GIT REPO auftreten. Er kann jedoch in der beschriebenen Situation auftreten, in der ein privates (dateibasiertes) Repo eingerichtet und von mehreren Benutzern gemeinsam genutzt wird.