Git Push kann nicht in Objektdatei schreiben – Berechtigung verweigert

Git Push kann nicht in Objektdatei schreiben – Berechtigung verweigert

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.

  1. Ich bin Benutzer1@Host1 und erstelle ein einfaches Git-Repository mit:

    mkdir /local/git-repos
    cd /local/git-repos
    git init --bare repo1.git
    
  2. 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
    
  3. 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

  4. 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, user1und einige Dateien, die im Besitz von sind user2. Das Problem besteht darin, dass später beim user1Versuch, Dateien auf den GIT-HOST zu übertragen, die objecterstellten Dateien und Verzeichnisse möglicherweise im Besitz von sind, user2sodass 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 GROUPvon Berechtigungen.

  5. 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 ( gitin 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.

verwandte Informationen