Dateiname in Git für Windows zu lang

663

Ich benutze Git-1.9.0-preview20140217für Windows. Wie ich weiß, sollte diese Version das Problem mit zu langen Dateinamen beheben. Aber nicht für mich.

Ich mache etwas falsch sicher: Ich habe git config core.longpaths trueund git add .dann git commit. Alles gut gelaufen. Aber wenn ich jetzt a mache git status, bekomme ich eine Liste von Dateien mit Filename too longzum Beispiel:

node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js: Filename too long

Für mich ist die Reproduktion ganz einfach: Erstellen Sie einfach eine Yeoman- Webanwendung mit dem Winkelgenerator ("yo angle") und entfernen Sie sie node_modulesaus der .gitignoreDatei. Wiederholen Sie dann die oben genannten Git-Befehle.

Was fehlt mir hier?

Papa Mufflon
quelle
Wo lesen Sie, dass diese Version die langen Dateinamen korrigieren sollte?
Iveqy
Hier ist die Pull-Anfrage für den Patch: github.com/msysgit/git/pull/122
Papa Mufflon
@PapaMufflon Kannst du die akzeptierte Antwort in eine Antwort mit mehr Punktzahl ändern? Es hat mir einfach sehr geholfen.
v.karbovnichy
@ v.karbovnichy bitte lies meine frage sorgfältig durch. Ich habe den Befehl bereits in der Antwort mit der höchsten Abstimmung ausgeführt. Aber als ich die Frage stellte, war die akzeptierte Antwort richtig: msys hatte immer noch diese Zeichenbeschränkung. Jetzt ist diese Einschränkung weg und git config core.longpaths true funktioniert wie es sollte.
Papa Mufflon
Ok, ich stimme dann zu
v.karbovnichy

Antworten:

700

Git hat ein Limit von 4096 Zeichen für einen Dateinamen, außer unter Windows, wenn Git mit msys kompiliert wird. Es verwendet eine ältere Version der Windows-API und es gibt ein Limit von 260 Zeichen für einen Dateinamen.

Soweit ich das verstehe, ist es eine Einschränkung von msys und nicht von Git. Sie können die Details hier lesen: https://github.com/msysgit/git/pull/110

Sie können dies umgehen , indem sie eine anderes Git - Client unter Windows oder Satz verwendet , core.longpathsum truewie in anderen Antworten erklärt.

git config --system core.longpaths true

Git ist eine Kombination aus Skripten und kompiliertem Code. Mit der obigen Änderung können einige der Skripte fehlschlagen. Aus diesem Grund ist core.longpaths nicht standardmäßig aktiviert.

Weitere Informationen finden Sie in der Windows-Dokumentation unter https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file :

Ab Windows 10, Version 1607, wurden die MAX_PATH-Einschränkungen aus den allgemeinen Win32-Datei- und Verzeichnisfunktionen entfernt. Sie müssen sich jedoch für das neue Verhalten anmelden.

Mit einem Registrierungsschlüssel können Sie das neue Verhalten für lange Pfade aktivieren oder deaktivieren. Um das Verhalten bei langen Pfaden zu aktivieren, legen Sie den Registrierungsschlüssel unter HKLM \ SYSTEM \ CurrentControlSet \ Control \ FileSystem LongPathsEnabled fest (Typ: REG_DWORD).

iveqy
quelle
19
Die Beschränkung auf 260 Zeichen in einem Pfad ist nicht MSYS-spezifisch, sondern eine allgemeine Windows-API-Nachahmung. Dies kann mithilfe von Unicode-Pfaden umgangen werden. Dies hat jedoch andere Nachteile, weshalb core.longpathsdiese Option standardmäßig nicht aktiviert ist. Beachten Sie auch, dass Git für Windows nicht gegen MSYS kompiliert wurde. Stattdessen handelt es sich um eine native Windows-Anwendung, die mit einer abgespeckten MSYS-Umgebung geliefert wird.
Sschuberth
3
@sschuberth: Gibt es andere Nachteile als mangelnde Kompatibilität mit Programmen, die keine langen Pfade unterstützen?
JAB
3
@JAB Ein weiterer Nachteil ist, dass lange Pfade immer absolut sein müssen; relative Pfade werden nicht unterstützt. Weitere Details finden Sie hier .
Sschuberth
4
Oder versuchen Sie als schnelle Lösung einfach, Ihr Repo in C: / unter Windows auszuchecken, um die Anzahl der Ordnerpfadzeichen zu verringern.
Akshay Lokur
5
Zu Ihrer Information, bis jetzt besteht das Problem immer noch. Vielleicht möchten wir die Weiterentwicklung eines echten Betriebssystems in Betracht ziehen ...
Géza Török
1033

Sie sollten in der Lage sein, den Befehl auszuführen

git config --system core.longpaths true

oder fügen Sie es manuell zu einer Ihrer Git-Konfigurationsdateien hinzu, um diese Funktionalität zu aktivieren, sobald Sie eine unterstützte Version von Git verwenden. Es sieht aus wie vielleicht 1.9.0 und danach.

sparkym3
quelle
13
Diese Konfigurationsoption hat das Problem für mich behoben, auch bei msys, wie in der akzeptierten Antwort erwähnt. (Insbesondere Version 1.9.4.msysgit.2).
Alex Osborn
5
Sourcetree verhält sich etwas seltsam, es sei denn, Sie "stellen auch sicher, dass SourceTree das Git des Systems verwendet und nicht das eingebettete". - Danke an Matej Drolc für diesen Rat
bstoney
38
Hier finden Sie einige Hintergrundinformationen, warum dies nicht standardmäßig aktiviert ist, sowie einige technische Details.
Sschuberth
12
get "Konnte Konfigurationsdatei C: \ Programme \ Git \ mingw64 / etc / gitconfig konnte nicht gesperrt werden", nachdem der obige Befehl ausgeführt wurde. Aber @ Yash Antwort funktionierte für mich
DivideByZero
10
@divideByZero, das git bash als Administrator ausführt, verhindert diesen Fehler.
Niek
204

Dies könnte helfen:

git config core.longpaths true

Grundlegende Erklärung: Diese Antwort schlägt vor, diese Einstellung nicht auf die globalen Systemkonfigurationen (auf alle Projekte, bei denen Konfigurationen vermieden --systemoder --globalmarkiert werden) anzuwenden . Dieser Befehl löst das Problem nur, indem er spezifisch für das aktuelle Projekt ist.

Sagiruddin Mondal
quelle
13
Die Leute hier haben bemerkt, dass diese Einstellung ein unvorhersehbares Verhalten hervorrufen kann, so dass es anscheinend vorzuziehen ist, den obigen Befehl als lokale Einstellung für Projekte zu verwenden, bei denen dies erforderlich ist, anstatt ihn anzuhängen, --systemder ihn auf alle Projekte anwendet
Grant Humphries,
4
Hey, das ist nur eine Kopie der anderen hoch bewerteten Antwort. könnte zumindest erklären, warum Sie es vorziehen, die Option --system zu entfernen.
Félix Gagnon-Grenier
78

Erstellen Sie .gitconfig und fügen Sie hinzu

[core]
longpaths = true

Sie können die Datei an einem Projektspeicherort (nicht sicher) und auch am globalen Speicherort erstellen. In meinem Fall ist der Ort C:\Users\{name}\.

Yash
quelle
10
Sie können dies auch mit dem folgenden Befehl tun:git config --global core.longpaths true
Curly
git config --global core.longpaths true hat für mich funktioniert danke
Rama Krshna Ila
1
Unter Verwendung von Visual Studio funktionierten die oben genannten Git-Bash-Lösungen bei mir nicht, aber das Suchen der .git / config-Datei für das Projekt und das Bearbeiten wie oben gezeigt haben funktioniert. Danke yash.
Andrew Pate
Das hat bei mir funktioniert, ich habe diese Datei gefunden und manuell geändert
Patlatus
1
Die oben genannten und überprüften Antworten sind korrekt, aber mit den Berechtigungen, die für die Datei erteilt wurden, ist es möglicherweise nicht möglich, die Datei mit diesen Befehlen zu aktualisieren. Dieser Ansatz ist wirklich einfach, da dies der manuelle Ansatz ist und bei mir sehr gut funktioniert hat. Sie können die .gitconfigDatei leicht im folgenden Pfad finden C:\Users\{username}und einfach bearbeiten.
Kavindu Narathota
53

Schritte zum folgen:

  1. Führen Sie Git Bash als Administrator aus
  2. Führen Sie den folgenden Befehl aus:
git config --system core.longpaths true

Hinweis : Wenn Schritt 2 nicht funktioniert oder einen Fehler anzeigt, können Sie auch versuchen, diesen Befehl auszuführen:

git config --global core.longpaths true

Lesen Sie mehr über git config hier .

Saikat
quelle
35

Die bessere Lösung besteht darin, den Longpath-Parameter von Git zu aktivieren.

git config --system core.longpaths true

Eine Problemumgehung, die funktioniert, ist das Entfernen des Ordners node_modules von Git:

$ git rm -r --cached node_modules
$ vi .gitignore

Fügen Sie node_modules in einer neuen Zeile in der .gitignore-Datei hinzu. Drücken Sie anschließend Ihre Änderungen:

$ git add .gitignore
$ git commit -m "node_modules removed"
$ git push
Janderson Silva
quelle
3
Es gibt einen guten Grund, den Ordner node_modules in git zu aktivieren: Wenn Sie möchten, dass sich Ihre Software nach einem Jahr mit Modulen, die möglicherweise von npm verschwinden, gleich verhält.
CFstras
@cfstras Wenn eine Bibliothek eine Sicherheitslücke aufweist und Sie nicht regelmäßig aktualisieren, treten mit Sicherheit Sicherheitsprobleme auf.
Janderson Silva
1
Natürlich müssen Sie Ihre Abhängigkeiten aktualisieren. Aber nur wenn Sie wollen und wenn etwas kaputt gehen würde, würden Sie Ihr Backup in Git wollen ...
cfstras
Ist wahr. Ich werde meine Antwort bearbeiten. Vielen Dank für Ihren Kommentar.
Janderson Silva
1
Kein Commit erforderlich node_modules: Die packages.lockDatei ist hier, um sicherzustellen, dass die von installierte Version npm installimmer dieselbe ist, bis Sie einenpm update
Pierre-Olivier Vares
32

Um ganz sicher zu sein, dass es unmittelbar nach der Initialisierung des Repositorys wirksam wird, aber bevor der Remote-Verlauf abgerufen oder Dateien ausgecheckt werden, ist es sicherer, ihn folgendermaßen zu verwenden:

git clone -c core.longpaths=true <repo-url>

-c Schlüssel = Wert

Legen Sie eine Konfigurationsvariable im neu erstellten Repository fest. Dies wird unmittelbar nach der Initialisierung des Repositorys wirksam, jedoch bevor der Remote-Verlauf abgerufen oder Dateien ausgecheckt werden. Der Schlüssel hat das gleiche Format wie von git-config 1 erwartet (z. B. core.eol = true). Wenn für denselben Schlüssel mehrere Werte angegeben werden, wird jeder Wert in die Konfigurationsdatei geschrieben. Dies macht es beispielsweise sicher, der Ursprungsfernbedienung zusätzliche Abrufreferenzspezifikationen hinzuzufügen.

Mehr Info

Uhrmacher
quelle
24

Beim Ausführen wurde git config --system core.longpaths truemir ein Fehler gemeldet:

"Fehler: Konfigurationsdatei C: \ Programme (x86) \ Git \ mingw32 / etc / gitconfig konnte nicht gesperrt werden: Berechtigung verweigert"

Behoben mit der Ausführung des Befehls auf globaler Ebene:

git config --global core.longpaths true
Arpit Aggarwal
quelle
Die globalen Einstellungen wirken sich nur auf den aktuellen Benutzer aus, während die Systemeinstellungen alle Benutzer auf dem Computer betreffen. Wenn dies Ihre Workstation ist, sind sie praktisch die gleichen, wie Sie möglicherweise nur einen Benutzer verwenden.
Handtuch
4
Wenn Sie eine Befehlszeilenanwendung sind, die als Administrator ausgeführt wird, funktioniert der erste Befehl!
Sachith Dickwella
12

Sie können auch versuchen, lange Dateipfade zu aktivieren.

Wenn Sie Windows 10 Home Edition ausführen, können Sie Ihre Registrierung ändern, um lange Pfade zu aktivieren.

Gehen Sie zu HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemin regeditund setzen Sie dann LongPathsEnabledauf1 .

Wenn Sie Windows 10 Pro oder Enterprise verwenden, können Sie auch lokale Gruppenrichtlinien verwenden.

Gehen Sie zu ComputerkonfigurationAdministrative VorlagenSystemDateisystem in gpedit.msc, öffnen Sie Win32-Langpfade aktivieren und setzen Sie es auf Aktiviert .

Julian Veerkamp
quelle
5
Ich glaube, dies muss in Kombination mit der Git-Konfiguration erfolgen, und es ist erwähnenswert, dass es aus den hier genannten Gründen nicht mit Windows Explorer funktioniert .
Neo
11
git config --global core.longpaths true

Der obige Befehl hat bei mir funktioniert. Die Verwendung von '--system' gab mir den Fehler, dass die Konfigurationsdatei nicht gesperrt war

amalik2205
quelle
2
Für Github Desktop-Benutzer ist dies die einzige, die funktioniert, da Github Desktop eine eigene Git-Konfiguration verwendet.
Csaba
4

Verschieben Sie das Repository in das Stammverzeichnis Ihres Laufwerks (temporärer Fix)

Sie können versuchen, das lokale Repository (den gesamten Ordner) vorübergehend in das Stammverzeichnis Ihres Laufwerks oder so nahe wie möglich am Stammverzeichnis zu verschieben.

Da der Pfad im Stammverzeichnis des Laufwerks kleiner ist, werden die Probleme manchmal behoben.

Unter Windows würde ich dies in C:\das Stammverzeichnis eines anderen Laufwerks verschieben.

Dheeraj Bhaskar
quelle
2
Dies ist das einzige, was mein Problem gelöst hat. Es war, dass ich zu viele Ordner im Pfad hatte.
J Brune
2

Ich hatte auch diesen Fehler, aber in meinem Fall war die Ursache die Verwendung einer veralteten Version von npm, v1.4.28.

Aktualisierung auf npm v3 gefolgt von

rm -rf node_modules
npm -i

arbeitete für mich. Die npm-Ausgabe 2697 enthält Details zur Ordnerstruktur "maximal flach" in npm v3 (veröffentlicht am 25.06.2015).

James Green
quelle
1

Wenn Sie mit Ihrer verschlüsselten Partition arbeiten, sollten Sie den Ordner in eine unverschlüsselte Partition verschieben, z. B. a / tmp , ausführen git pullund dann zurück verschieben.

Augustowebd
quelle
0

In einer Windows-Maschine

Führen Sie die Eingabeaufforderung als Administrator aus und führen Sie dann den folgenden Befehl aus

git config --system core.longpaths true

Kartick Shaw
quelle