Git-Push-Fehler: alte Verknüpfung kann nicht aufgehoben werden (Berechtigung verweigert)

190

Auf dem Remote-Server habe ich einen Post-Receive-Hook eingerichtet, um ein Git-Checkout in meinem Repository durchzuführen:

#!/bin/sh
GIT_WORK_TREE=/var/www/<website> git checkout -f

Wenn ich jedoch einen Push von meinem lokalen Computer zum Git-Repository auf dem Server mache, werden die folgenden Fehlermeldungen angezeigt:

remote: error: unable to unlink old '<file>' (Permission denied)

Dies erscheint um ein Vielfaches, eine Fehlermeldung für fast jede Datei.

Ich habe jedoch eine README.txt-Datei, die ich mit git ändern kann. Hier sind die Berechtigungen:

-rw-r--r--  1 <serverusername>  <serverusername>  2939 Aug  2 10:58 README.txt

Aber andere Dateien mit genau demselben Eigentümer und denselben Berechtigungen geben mir diesen Fehler.

In einem anderen lokalen Repository für eine andere Website habe ich die Dateien mit meinem lokalen Computernamen als Eigentümer. Wenn ich auf den Remote-Server pushe, respektiert dies den Remote-Server-Eigentümer der Dateien und funktioniert wie ein Zauber.

Offensichtlich scheint es sich um einen Fehler im Zusammenhang mit Berechtigungen zu handeln, aber ich kann keinen Weg finden, ihn zu beheben. Irgendwelche Vorschläge?

rfc1484
quelle

Antworten:

335

Wenn Sie die Verknüpfung der Datei aufheben müssen, müssen Sie die Berechtigung 'w' für das Verzeichnis haben, in dem sich die Datei befindet, nicht für die Datei ...

Jan Marek
quelle
65
In der Tat war das das Problem, ich habe es sudo chmod -R g+wüber die schuldigen Ordner behoben .
rfc1484
1
OMG danke. War so verärgert darüber, dass die Berechtigungen in der Datei korrekt waren. Es macht Sinn, dass die Updates eher mvAktionen ähneln als nur überschreiben.
DoubleJosh
1
Das Ändern der Verzeichnisberechtigungen hat bei mir funktioniert (danke!), Aber es ist seltsam, weil ich die fraglichen Dateien ohne Probleme manuell über SFTP überschreiben konnte. Seltsam, dass Git es nicht konnte, als er es versuchte.
Jonathan Stark
1
Beachten Sie auch, dass dieser Fehler ebenfalls angezeigt wird, wenn Sie die Datei noch geöffnet haben. Hatte den gleichen Fehler und deshalb konnte ich meine Änderungen nicht einschieben.
Matias
1
Das erste Zeichen der ls -lAnzeige gibt den Dateityp an und bezieht sich nicht auf Berechtigungen. Die verbleibenden neun Zeichen befinden sich in drei Sätzen, die jeweils eine Berechtigungsklasse mit drei Zeichen darstellen. Der erste Satz repräsentiert die Benutzerklasse. Der zweite Satz repräsentiert die Gruppenklasse. Der dritte Satz repräsentiert die andere Klasse. Das g+win chmod gibt dem Gruppensatz (dem gParameter) die Berechtigung zum Schreiben (des wParameters)
rfc1484
67
sudo chmod -R ug+w .;

Dieser Befehl würde das Problem beheben. Es gibt Schreibberechtigungen für den Ordner.

Rajendra Kumar Vankadari
quelle
41

Wenn Sie eine IDE verwenden, besteht das Problem höchstwahrscheinlich darin, dass die Datei von einem Prozess verwendet wurde. Als ob Ihr Kater die Datei verwenden könnte. Versuchen Sie, diesen bestimmten Prozess zu identifizieren und zu schließen. Das sollte dein Problem lösen.

Rama Krishna Gollapudi
quelle
12

Ich hatte das gleiche Problem und keine der oben genannten Lösungen funktionierte für mich. Ich habe den fehlerhaften Ordner gelöscht. Dann:

git reset --hard

Löschte alle verbleibenden Dateien, um den Git-Status zu bereinigen, und tat dann:

git pull

Es hat endlich funktioniert.

ANMERKUNG: Wenn der Ordner beispielsweise ein öffentlicher Ordner mit Erstellungsdateien war, denken Sie daran, die Dateien neu zu erstellen

wcyn
quelle
Danke, auch für mich funktionierte nichts anderes. Das Löschen schien die einzige Option zu sein.
Math0ne
In meinem Fall ist dieser beleidigende Ordner
.git
11

Ich denke, das Problem kann mit dem Besitz des Ordners liegen, also setzen Sie ihn auf den aktuellen Besitz des Benutzers

sudo chown -R your_login_name /path/to/folder
Die Lösung finden Sie [hier] [1]
Soumitra Sarkar
quelle
7

FWIW - Ich hatte ein ähnliches Problem und bin mir nicht sicher, ob dies das Problem behoben hat (über den Berechtigungs-Mod hinaus): Eclipse schließen, das den Zweig mit diesem Problem verwendet hat.

cellepo
quelle
Ebenso habe ich diesen Fehler erhalten, als eine versionierte CSV-Datei in Excel geöffnet war. Durch einfaches Schließen von Excel wurde das Problem behoben. Dies gilt wahrscheinlich auch für andere Anwendungen unter Windows und hängt wahrscheinlich davon ab, wie das Programm die Datei während der Bearbeitung als geöffnet markiert.
Carel
3

Dies ist eine alte Frage, die jedoch Mac-Benutzern helfen kann.

Wenn Sie Dateien manuell von Time Machine kopieren, anstatt sie über Time Machine wiederherzustellen, werden ACLs zu allem hinzugefügt , was Ihre Berechtigungen beeinträchtigen kann.

Der Abschnitt in diesem Artikel mit dem Titel "Beheben von Mac OS X-Dateiberechtigungen" zeigt beispielsweise, dass "jeder" über benutzerdefinierte Berechtigungen verfügt, was alles durcheinander bringt:

Ungültige Berechtigungen von http://dreamlight.com/how-to-fix-mac-os-x-file-permissions

Sie müssen die ACLs aus diesen Verzeichnissen / Dateien entfernen. Diese Super User-Antwort geht hinein, aber hier ist der Befehl:

sudo chmod -RN .

Dann können Sie sicherstellen, dass Ihre Verzeichnisse und Dateien über die richtigen Berechtigungen verfügen. Ich benutze 750für Verzeichnisse und 644für Dateien.

kylesimmonds
quelle
2

Ich erhalte diesen Fehler und andere seltsame Git-Fehler, wenn ein Server ausgeführt wird (in Intellij). Wenn Sie den Server stoppen und den Befehl git erneut versuchen, wird dies häufig für mich behoben.

Phil Carter
quelle
2
git reset --hard

Hat für mich gearbeitet

Kreker
quelle
4
Das könnte ein bisschen extrem sein, da es viel mehr macht.
CDADR
2
sudo chown -R $USER:$USER .

Hat den Job für mich gemacht.

BARJ
quelle
1

Einige Dateien sind schreibgeschützt, so dass selbst Git sie nicht überschreiben kann. Ändern Sie die Ordnerberechtigung, um das Schreiben des Ordnernamens sudo chmod 775 zu ermöglichen

Und dann wieder ziehen

Carmela
quelle
0

Denken Sie auch daran, die Berechtigung des Stammverzeichnisses selbst zu überprüfen!

Du wirst vielleicht finden:

drwxr-xr-x  9 not-you www-data  4096 Aug  8 16:36 ./
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 README.txt
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 UPDATE.txt

und der Fehler "Berechtigung verweigert" wird angezeigt.

Cadavre
quelle
0

Das Ziehen hat möglicherweise zu lokalen Änderungen geführt.

Fügen Sie Ihre nicht verfolgte Datei hinzu:

git hinzufügen.

Änderungen verstecken.

git stash

Löschen Sie lokale Änderungen.

Git Stash Drop

Mit Sudo-Erlaubnis ziehen

Sudo Git Pull Remote Branch

user2858738
quelle
Es geht nur um die Erlaubnis der lokalen Dateien. Es gibt nichts mit Git zu tun. Ich habe gerade einen Befehl mit sudo ausgeführt und es hat funktioniert, also waren nicht alle diese Schritte erforderlich
Raviramani