Git Rebase: "Fehler: Stat 'Datei' kann nicht angegeben werden: Berechtigung verweigert"

342

Ich benutze Git und habe ein kleines Commit gemacht, gefolgt von einem großen. Ich beschloss, git rebasedie beiden Commits zusammenzudrücken, bevor ich sie drückte. (Ich habe das noch nie zuvor gemacht.)

So tat ich:

git rebase -i HEAD~2

Dies gab mir meinen Editor, wo ich mich entschied, das frühere Commit auszuwählen und das spätere zu quetschen. Als ich rettete, sagte Git:

Fehler: ' Dateiname ' kann nicht angegeben werden : Berechtigung verweigert

Sha1 konnte für späteres Festschreiben nicht angewendet werden ... erste Textzeile für dieses Festschreiben

Jetzt:

  • Kein Commit wird angezeigt, wenn ich es tue git log.
  • git status sagt mir, dass ich "derzeit in keinem Zweig" bin.
  • Eine Datei wird als geändert und im Index aufgeführt, und zwei Dateien werden als nicht verfolgt aufgeführt. Mein erstes Commit hatte nur eine Datei (glaube ich) und mein zweites Commit hatte ein gutes Dutzend.

Was ist passiert!? Wie behebe ich das?

Ryan Lundy
quelle
10
Verwenden Sie zufällig Git unter Windows?
CB Bailey
Ja. Ich führe die Befehle in einem DOS-Fenster aus.
Ryan Lundy
2
Führen Sie eine Virenprüfung durch? Manchmal verursachen Virenprüfungsprogramme von schlechter Qualität solche Probleme.
Greg Hewgill
53
Ich hatte das Problem mit dem Auschecken von Git (daher ist kein Abbruch möglich, wie in der akzeptierten Antwort vorgeschlagen), aber das Schließen aller meiner IDEs ließ mich durch. Die zweite Antwort sollte die akzeptierte sein
plus
1
@ IanGrainger, die Antwort, auf die Sie sich beziehen, wurde acht Monate nach der akzeptierten Antwort veröffentlicht. Muss ich alle paar Monate vorbeikommen und alle meine Fragen besuchen, um möglicherweise akzeptierte Antworten auf alle zu ändern? Die Abstimmungsschaltflächen sind aus einem bestimmten Grund vorhanden. Wenn Ihnen die am besten bewertete Antwort mehr hilft als die akzeptierte Antwort, verwenden Sie sie. Wer hält dich auf? Aber ich habe die Antwort akzeptiert, weil sie mir geholfen hat, und ich bin derjenige, der die Frage gestellt hat.
Ryan Lundy

Antworten:

195

Ich habe diesen Fehler bisher nur unter Windows gesehen und es scheint zu bedeuten, dass etwas Git daran gehindert hat, eine Datei zu ändern, als es versuchte, einen Patch anzuwenden.

Windows neigt dazu, Prozessen exklusiven Zugriff auf Dateien zu gewähren, wenn dies eigentlich nicht erforderlich sein sollte. In der Vergangenheit waren Virenprüfer eine Quelle des Verdachts, aber ich habe dies nie endgültig bewiesen.

Wahrscheinlich ist es am einfachsten, abzubrechen und es erneut zu versuchen, in der Hoffnung, dass es beim nächsten Mal nicht passiert.

git rebase --abort

Sie können versuchen, zu verwenden git applyund zu wissen, was Commit Git tatsächlich versucht hat, bevor Sie ein tun, git rebase --continueaber ehrlich gesagt würde ich dies nicht empfehlen. Die meisten Male, in denen ich dies versucht habe, gab es eine bessere als die gleiche Chance, dass etwas versehentlich übersehen oder durcheinander gebracht wird.

CB Bailey
quelle
6
@ Kyralessa: Hmmm, hast du versucht neu zu starten? Wenn diese Datei dauerhaft gesperrt wird, sollten Sie nach einem Neustart (oder etwas weniger drastischem, das die Datei freigibt) in der Lage git checkout -- previously-locked-filesein, wieder einsatzbereit zu sein.
CB Bailey
51
Nun, ich bin mir immer noch nicht sicher, was genau passiert ist, aber wie ich am besten beurteilen kann, hat VS 2010 die Datei gesperrt (seltsam, weil es sich um eine XML-Dokumentdatei handelte). Der Prozess-Explorer hat nichts gefunden, was diese Datei sperrt, aber nachdem ich VS beendet habe, konnte git checkoutich die Datei zurückholen ( git statusdarin wurde sie gelöscht), und jetzt ist alles wieder so, wie es war, bevor ich versucht habe, neu zu gründen / zu quetschen. Vielleicht sollte ich es noch einmal versuchen, obwohl ich mich an dieser Stelle etwas unwohl fühle.
Ryan Lundy
3
Follow-up, viele Monde später: Ich hatte dieses Problem nicht mehr. Das Rebasing hat gut funktioniert, einschließlich des interaktiven Rebasings. Es muss ein vorübergehender Fehler beim Sperren von VS-Dateien gewesen sein.
Ryan Lundy
49
Das Schließen von Visual Studio 2010 hat es auch für mich behoben
Trev
4
Atom sperrt anscheinend auch Dateien. Neustart behoben.
Augustin Bralley
651

Schließen Sie alle Programme, in denen der Ordner geöffnet ist, z. B. Editoren, Explorer-Fenster, Eingabeaufforderungen und FTP-Programme. Dies behebt immer das Problem für mich unter Windows.

Cameron Wright
quelle
72
Ich habe den gleichen Fehler bekommen. Ich habe gerade das visuelle Studio geschlossen und alles hat funktioniert.
Jacobsimeon
6
Ich schloss fast alles, was mir einfiel, bevor ich mich an den WinLess LESS -> CSS-Konverter erinnerte, der sich im Hintergrund versteckte.
Michael Martin-Smucker
6
Visual Studio hat ein Nuget-Paket gesperrt, als ich versuchte, es zusammenzuführen. Das Schließen von VS hat bei mir funktioniert.
CodeHxr
7
Die häufigste Ursache für diesen Fehler, den ich unter Windows gesehen habe, ist das Sperren der Dateien durch Visual Studio. Schließen Sie VS wie vorgeschrieben, bevor Sie die Zweige wechseln, zusammenführen usw.
Longda
5
"Ich auch" Antwort für Atom. Es scheint Dateien und Verzeichnisse zu sperren; Das Schließen behebt das Problem.
Ajm
277

Schließen Sie einfach Ihre IDE (VISUAL STUDIO / ATOM usw.). Es könnte gehen

ManJan
quelle
1
In IntelliJ hat das Stoppen des laufenden Tomcat-Dienstes für mich funktioniert. Etwas einfacher als ein Neustart der IDE.
Phil Carter
Ich hatte auch ein geöffnetes Git Bash-Fenster, das für mich funktionierte.
Vince I
Jede IDE, die es wert ist, gesalzen zu werden, sollte nichts in einem Repo einschließen ... Daumen hoch !!
LightCC
arbeitet an vs Code
Muhammed Moussa
Klicken Sie auf dieses Problem, nachdem Sie mit Atom unter Windows 10 in einen temporären Zweig eingecheckt haben. Durch Schließen und erneutes Öffnen von Atom wurde das Problem für mich behoben.
mickburkejnr
24

Wenn ich dies auf meinem Computer sehe, ist es schlimmer als nur "ein Prozess hat die Datei geöffnet". Der tatsächliche Besitz der Datei wird bis zu dem Punkt aufgebockt, an dem ich (als Administrator) erst nach einem Neustart darauf zugreifen kann.

Soweit ich das beurteilen kann, ist IIS Teil des Problems. Wenn ich zwischen zwei Hauptzweigen wechsle, für deren Änderung viele Dateien erforderlich sind, löscht git eine Datei oder ein Verzeichnis (normalerweise DLLs), während IIS versucht, etwas damit zu tun. Zu diesem Zeitpunkt überschreibt der IIS-Prozess die Datei auf der Festplatte automatisch mit einer Version, die gesperrt ist und anscheinend niemandem gehört.

Das Anhalten von IIS an dieser Stelle reicht nicht aus. Das Beste, was ich herausgefunden habe, ist ein Neustart. Denken Sie daran, IIS zu stoppen, bevor Sie in Zukunft zwischen wichtigen Zweigen wechseln.

Ich weiß, dass das die Frage nicht wirklich beantwortet, aber für andere hilfreich sein könnte.

Mike Ruhlin
quelle
Hallo Mike ... wir haben genau das gleiche Problem, aber es kam aus heiterem Himmel. Wir haben bei vielen Projekten mit IIS den gleichen Prozess angewendet und hatten nie ein Problem. Eines Tages beginnt es jedoch ... verwirrend und frustrierend. Hast du mehr gelernt, seit du das geschrieben hast?
Ethan Brown
Vielen Dank für den Einblick, Mike. In meinem Fall hat das Auschecken eines alten Zweigs mit einem ASP.NET MVC-Projekt, das eine andere Bindungs-URL als der vorherige Zweig hatte, dazu geführt, dass Visual Studio und IIS einige Dateien im Projekt gesperrt haben. Durch das Stoppen des entsprechenden Apppools in IIS wurde die Sperre aufgehoben.
Fundead
IIS war auch für mich der Schuldige; Wenn dies auftaucht, iisresetscheint ein Quick die Dateisperren aufzuheben.
Alexm
Ich habe festgestellt, dass das Gleiche mit OneDrive passiert: Das Wechseln der Zweige in einem in OneDrive gespeicherten Repo verwirrt es wirklich
CharlieB
Dies ist mir auch unter win10 passiert und erfordert einen Neustart, aber ich habe die iisresetLösung nicht getestet .
Qdread
17

Unter Windows kann es sich um einen TortoiseGIT-Prozess handeln, der diese Dateien blockiert. Öffnen Sie den Task-Manager und beenden Sie den Prozess TGitCache.exe .

romanlv
quelle
2
Gut zu wissen, obwohl ich in meinem Fall TortoiseGit nicht verwende. Ich benutze nur die Kommandozeile.
Ryan Lundy
13

Ich bin gerade auf diesen Thread von Antworten gestoßen - dieser Fehler ist so ein falscher Fehler. # Fehler: Kann nicht 'reddit / app / views / links' angeben: Berechtigung verweigert

Das ist alles, was ich habe - beim Versuch zu verschmelzen. Ich las einige der Antworten und kam dann zu der Erkenntnis - alles, was ich tun musste, war meinen Code-Editor zu schließen, der zufällig Atom ist.

Nach dem Schließen des Editors habe ich "git merge" erneut ausgeführt und boomte, es hat funktioniert.

Was für ein sinnloser Fehler :(

ich bin Batman
quelle
Vielen Dank! Nicht jeden Tag sehen Sie die richtige Antwort in der Liste. Ich empfehle, dies als die richtige Antwort zu markieren. Anstatt den aktuellen Vorgang abzubrechen, ist es sinnvoll, das eigentliche Problem zu lösen.
Nikhil Kuriakose
12

Wenn Sie vscode verwenden, beenden Sie das Terminal und öffnen Sie ein neues. sonst vielleicht auch Terminal schließen

Muhammed Moussa
quelle
Das war es, sah aus wie eine Prozesssperre oder so
Mike Upjohn
10

Das passiert mir gelegentlich unter Windows

Fehler: 'Dateiname' kann nicht angegeben werden: Berechtigung verweigert

Meistens habe ich mehrere Instanzen von Bit Bash geöffnet, und eine der Git Bash-Instanzen befindet sich in einem Verzeichnis, das in dem Remote-Zweig, aus dem ich ziehe, nicht vorhanden ist.

Das Schließen aller bis auf eine Instanz von Git Bash löst das Problem für mich.

Knuspriger Ninja
quelle
9

Wenn die von Ihnen verwendete IDE (falls Sie eine verwenden) möglicherweise ebenfalls im Weg war. Das ist mir bei der Verwendung von QtCreator passiert.

rgngl
quelle
Dies war bei mir mit PhpStorm der Fall. Durch einen Neustart wurde der Fehler behoben.
lancemonotone
7

Mit SourceTree in Win 10 wurde das Problem durch Schließen des Atom-Editors behoben.

Fehler beim Reproduzieren:

  1. Erstellen Sie in Zweig B eine MD-Datei, indem Sie sie mit Atom bearbeiten, speichern und festschreiben.
  2. Wechseln Sie zu Zweig A und ziehen Sie neue Commits vom Server herunter.
  3. Versuchen Sie, zurückzuschalten, Opps, es heißt "Fehler: 'Datei' kann nicht angegeben werden: Berechtigung verweigert".
Attolee
quelle
6

Dies kann auch passieren, wenn Sie SublimeText verwenden und das Popup-Fenster, in dem Sie zum Kauf des Programms aufgefordert werden, nicht geschlossen ist.

ahnbizcad
quelle
1
Habe es auch mit Atom bekommen, indem ich den Projekt- / Dateibaum geöffnet habe
Hal
1
Wie bei @Hal war mein Problem bei Atom. Dies lag daran, dass sich ein Ordner in einem Zweig nicht in einem anderen Zweig befand. Durch das Schließen von Atom wird das Problem behoben. Sie können jedoch auch den Projektbaum reduzieren (um den Ordner auszublenden), und das funktioniert auch.
jsalwen
6

Dies ist häufig der Fall, wenn Sie Vorverarbeitungssoftware / -anwendungen haben, die das Projekt beobachten, z. B. Prepros oder Codekit. Atom und Sublime (und sogar Notepad ++) können dies auch verursachen, wenn eine Datei im Projekt gerade bearbeitet wird.

Der einfachste Weg, um das Problem zu umgehen, besteht darin, alle geöffneten Projektdateien zu schließen, Ihre Zweige zusammenzuführen und sie dann erneut zu öffnen, um sie zu aktualisieren. Auf diese Weise werden auch Probleme vermieden, bei denen das Programm keine Änderungen mehr bemerkt und Sie gezwungen sind, die Projekte manuell zu aktualisieren.

Steven Ventimiglia
quelle
1
o Mann! Ich lief Ulme-Live im Hintergrund. Das ersparte mir eine Menge Kopfschmerzen.
frostymarvelous
6

Wenn Sie Webpack ausführen, fahren Sie es herunter. Fahren Sie auch Ihre IDE herunter. Sollte gut funktionieren, nachdem Sie diese Dinge getan haben.

KennethDale1
quelle
4

Ich hatte ein ähnliches Problem. Aber es war sehr einfach zu lösen. Auf einem Windows-Computer hatte mein Datei-Explorer einen Ordner geöffnet, der in einem Zweig vorhanden war, aber nicht in dem anderen, den ich ausgecheckt habe. Durch Schließen des Datei-Explorers wurde das Problem behoben.

mmmdearte
quelle
4

Ich hatte dies gerade unter Win 7.

$ git stash pop error: Status 'parentFolder / subfolder' kann nicht angegeben werden: Berechtigung verweigert Fehler: Status 'parentFolder / subfolder' kann nicht angegeben werden: Berechtigung verweigert

Diagnose:

1> Ich bin in den Unterordner gegangen und er ist da und konnte ihn nicht löschen!

2> Verwenden Sie "Prozess-Explorer" -> Suchen -> Handles und DLLs suchen -> geben Sie dort den Namen "Unterordner" ein und suchen Sie.

Ergebnis: Es stellt sich heraus, dass XMLSpy dort eine der XML-Dateien geöffnet hat, XML Spy schließt und Stash Pop erneut versucht. Es funktioniert jetzt.

Gob00st
quelle
4

Ist mir unter Windows passiert, als ich das integrierte IntelliJ-Terminal neu aufgebaut habe . Ich habe festgestellt, dass die Git-Bash- Client-Instanz parallel ausgeführt wurde.

Das Schließen von Git Bash löste das Problem.

Louis
quelle
2

Meine Begegnung mit diesem Problem wurde von meinem Redakteur Intellij verursacht. Als Teil seiner internen Versionskontrollen hatte es alle versteckten Git-Dateien durchlaufen und gesperrt. (Aus verschiedenen Gründen habe ich das mit Intellij gelieferte Git-Plugin nicht verwendet ...)

Also habe ich als Administrator ein normales Dos-Fenster geöffnet, in das Verzeichnis gewechselt und ausgeführt

attrib -R /S

Dadurch wurde die Sperre für die Dateien aufgehoben und alles funktionierte danach. Ich konnte meine Änderungen mit dem GitHub-Windows-Client synchronisieren.

Perry Tew
quelle
2

Ich stimme den obigen Antworten zu "Visual Studio schließen" zu.

Ein zusätzlicher Schritt Allerdings hatte ich auch zu tun , nachdem ich geschlossene Visual Studio hatte , war manuell den töten „Devenv.exe“ Visual Studio - Prozess im Task Explorer. Nachdem ich dies getan hatte, konnte ich wieder in gitbash laufen:

Git Pull

und der Fehler " Dateiname kann nicht angegeben werden " ist verschwunden. Möglicherweise liegt es an einer Visual Studio-Erweiterung, die den Prozess auch nach dem Schließen länger offen hält.

Ladygargar
quelle
2

Ich hatte gerade dieses Problem. Die Sache ist - wenn Sie eine Datei geöffnet haben, die nach dem Rebase entfernt / ersetzt wurde (Sie hatten einen Zweig, der diese Datei nicht mehr hat), beschädigt das Git-System. Also habe ich alle geöffneten Dateien geschlossen und dann versucht, in einem anderen Zweig auszuchecken

BlondinkaBrain
quelle
2

Eine alternative Lösung, anstatt alle Apps zu schließen, die das Verzeichnis möglicherweise sperren, wie es fast jede andere Antwort vorschreibt, wäre die Verwendung eines Dienstprogramms, das die Dateien / das Verzeichnis entsperrt, ohne alles zu schließen. (Ich hasse es, Visual Studio neu starten zu müssen)

LockHunter ist das, was ich benutze: https://lockhunter.com/ Es gibt wahrscheinlich auch andere da draußen, aber dieses hat für mich großartig funktioniert.

Heiss und
quelle
1

Gleiches Problem unter Windows 10 64 Bit unter Git Bash Version 2.9.0.windows1 Verwenden von Atom als Editor.

Dies funktionierte für mich: Ich habe den Git-Softwareordner (für mich war dies C: \ Programme \ Git) zu den Ausschlüssen für Windows Defender hinzugefügt.

Nachdem der Ausschluss hinzugefügt wurde, git checkout 'file'funktionierte gut.

Paul Spaven
quelle
1

Dieser Fehler kann auch durch die Tatsache verursacht werden, dass Dateien aufgrund vorheriger Git-Aktionen immer noch "gesperrt" sind. Dies hängt damit zusammen, wie die Windows-Dateisystemschicht funktioniert. Ich habe einmal eine nette Erklärung dazu gelesen, kann mich aber nicht erinnern, wo.

In diesem Fall müssen Sie jedoch Ihren unterbrochenen Rebase-Prozess fortsetzen , da es sich im Grunde genommen um eine Race-Bedingung handelt . Leider passiert mir das die ganze Zeit, deshalb habe ich diesen kleinen gefährlichen Helfer geschrieben, um meine Rebases am Laufen zu halten:

#!/bin/sh

set -e

git checkout .
git clean -df
git rebase --continue

Wenn Sie besonders sicher sein möchten, können Sie git rebase --edit-todoüberprüfen, ob das nächste anzuwendende Commit tatsächlich dasjenige ist, das zuvor nicht angewendet wurde. Verwenden git clean -dnSie diese Option , um sicherzustellen, dass Sie keine wichtigen Dateien löschen.

raphinesse
quelle
1

Ist mir in Windows passiert, wenn ich Photoshop verwendet habe: Als ich ein Bild gespeichert und dann zu einem Zweig gewechselt habe (Photoshop mit geöffnetem Bild verlassen), habe ich den Git-Fehler erhalten. Schließen Sie das Bild in Photoshop und versuchen Sie es erneut

pscheit
quelle
1

Wenn Sie das Meld-Merge-Tool geöffnet haben, schließen Sie es. Es blockiert das Überschreiben von Dateien.

user2441511
quelle
1

Das Beenden des Prozesses w3wp.exe im Zusammenhang mit dem Repository hat dies für mich behoben.

Ric
quelle
1

In meinem Fall lief ein Webpack-Entwicklungsserver hinterher.

Charith
quelle
0

Ich habe diesen Fehler erhalten, als sich mein VS1013 in einem Zweig mit dem Ziel 8.1 befand und ich versuchte, einen 8.0-Zweig auszuchecken. Ich musste zu VS zurückkehren und UpdateAll zulassen. Dann konnte ich den 8.0-Zweig fehlerfrei auschecken.

Aleksandr Gembinski
quelle
0

Ich war auch auf einem Windows-Computer mit Git Shell, als ich auf den gleichen Fehler stieß.

Zu der Zeit hatte ich jedoch mehrere Git-Terminals geöffnet.

Das erste Terminal hat den Fehler erhalten, den Sie oben gepostet haben, und das andere Terminal hat zuvor den Fehler ausgeführt grunt serve Terminalbefehl von yeoman (unten verlinkt) ausgeführt. Das zweite Terminal musste geöffnet bleiben, um eine lokale Serverinstanz zu hosten.

Das Herunterfahren aller Terminalfenster, in denen laufende Prozesse ausgeführt werden, kann dazu führen, dass der Fehler behoben wird.

Zumindest hat das bei mir funktioniert. Nachdem ich das zweite Terminalfenster geschlossen hatte, konnte ich problemlos verschiedene Zweige auschecken und Dateien bearbeiten.

Grunt Serve Command - Yeoman.I / O
http://yeoman.io/learning/

Shawesome
quelle
0

Ich bin gerade auf dieses Problem gestoßen. Keine der Antworten hier hat dies für mich gelöst.

Am Ende waren es Nuget-Pakete, die ich in einem Zweig hinzugefügt habe, der nach dem Zurückschalten auf den Hauptzweig nicht zu existieren schien. Sobald ich eine Zusammenführung durchgeführt habe, würde es heißen, Newton ... xml konnte nicht stat. Ich würde zu der fraglichen Datei gehen und sie öffnen, aber Windows gab einen Fehler zurück, der besagte, dass die Datei nicht gefunden werden kann (obwohl ich sie mir genau angesehen habe).

Wie ich das gelöst habe, war ein Rechtsklick auf die Datei löschen (was funktioniert hat, aber ich konnte sie nicht öffnen, weil Windows sie nicht finden konnte ???) und versuchen, sie erneut zusammenzuführen, und das Problem wurde behoben.

Sehr eigenartig.

Hoffe das hilft später jemandem.

Der Noob
quelle
0

Ich verließ meinen Texteditor, der auf die Projektverzeichnisse zugegriffen hatte, und versuchte dann, ihn mit dem Hauptzweig zusammenzuführen, und es funktionierte.

PudparK
quelle