Lange Pfade und Dateirechte unter Windows
Warum Windows bei Pfaden und Dateirechten besondere Aufmerksamkeit braucht
Git wurde ursprünglich in einer Unix-Umgebung entwickelt. Windows 11 unterstützt Git hervorragend, unterscheidet sich jedoch bei zwei Themen grundlegend von Linux und macOS:
- Pfadlängen: Tiefe Verzeichnisstrukturen können technische Längenlimits überschreiten.
- Dateirechte: Windows nutzt primär NTFS-Berechtigungen statt des Unix-Ausführungsbits.
Diese Unterschiede werden besonders sichtbar, wenn ein Team plattformübergreifend arbeitet, etwa mit Windows-Entwicklung, Linux-Containern und einer CI-Pipeline auf GitHub Actions.
Ziel: Das Repository soll auf jedem System zuverlässig klonbar sein, ohne dass lokale Windows-Einstellungen versehentlich Änderungen an Dateirechten erzeugen.
Lange Pfade verstehen
Ein Dateipfad setzt sich aus Laufwerk, Verzeichnissen und Dateinamen zusammen, zum Beispiel:
C:\Users\Anna\source\mein-projekt\vendor\beispiel\paket\src\Komponente\SehrLangerDateiname.php
Historisch sind viele Windows-Programme auf eine maximale Pfadlänge von 260 Zeichen ausgerichtet. Dieses klassische Limit wird oft als MAX_PATH bezeichnet.
Ein PHP-Projekt kann dieses Limit schnell erreichen:
- Ein langer Benutzername und ein tiefes Arbeitsverzeichnis.
- Verschachtelte Composer-Abhängigkeiten in
vendor. - Lange Namespace- und Klassennamen.
- Generierte Dateien, Caches oder Testdaten.
- Monorepos mit vielen Ebenen.
Ein problematischer Pfad könnte beispielsweise so aussehen:
C:\Users\Anna\Documents\Kunden\SehrWichtigesUnternehmensprojekt\backend\vendor\anbieter\framework\src\Component\Configuration\Generated\VeryLongGeneratedConfigurationFileName.php
Typische Symptome
Wenn Git oder ein anderes Werkzeug mit zu langen Pfaden scheitert, erscheinen unter anderem Meldungen wie:
Filename too long
error: unable to create file ...: Filename too long
Path too long
Mögliche Folgen sind:
git clonebricht unvollständig ab.git checkoutkann einzelne Dateien nicht erzeugen.git pulloder ein Branch-Wechsel scheitert.- Composer kann Abhängigkeiten nicht vollständig installieren.
- PhpStorm zeigt Dateien als fehlend oder nicht synchronisiert an.
Unterstützung für lange Pfade in Windows aktivieren
Windows 11 kann lange Pfade grundsätzlich unterstützen. Damit dies zuverlässig funktioniert, müssen jedoch sowohl Windows als auch die jeweilige Anwendung dafür vorbereitet sein.
Lange Win32-Pfade in Windows aktivieren
Die Einstellung ist in Windows 11 Pro, Enterprise und Education über Gruppenrichtlinien erreichbar.
-
Öffne das Startmenü.
-
Suche nach
gpedit.msc. -
Starte den Editor für lokale Gruppenrichtlinien.
-
Navigiere zu:
Computerkonfiguration > Administrative Vorlagen > System > Dateisystem -
Öffne die Richtlinie „Win32 lange Pfade aktivieren“.
-
Wähle „Aktiviert“.
-
Starte Windows neu.
In Windows 11 Home ist der Gruppenrichtlinien-Editor normalerweise nicht verfügbar. Die Einstellung kann stattdessen über die Registrierung gesetzt werden.
⚠️ Änderungen an der Windows-Registrierung sollten nur bewusst und mit den nötigen Berechtigungen durchgeführt werden.
Öffne PowerShell als Administrator und führe aus:
New-ItemProperty `
-Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled" `
-Value 1 `
-PropertyType DWORD `
-Force
Danach Windows neu starten.
Den aktuellen Wert kannst du prüfen:
Get-ItemProperty `
-Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled"
Ein aktivierter Wert sieht so aus:
LongPathsEnabled : 1
Lange Pfade für Git aktivieren
Zusätzlich muss Git for Windows angewiesen werden, lange Pfade zu akzeptieren:
git config --global core.longpaths true
Die Einstellung überprüfen:
git config --global --get core.longpaths
Erwartete Ausgabe:
true
Wenn Git für alle Benutzer des Computers konfiguriert werden soll, verwende eine administrative Konsole:
git config --system core.longpaths true
Die Herkunft aller gesetzten Werte zeigt:
git config --show-origin --get-all core.longpaths
Beispielausgabe:
file:C:/Program Files/Git/etc/gitconfig true
Wichtig:
core.longpathsist eine lokale Git-Client-Einstellung. Sie wird nicht in das Repository übernommen und betrifft keine anderen Teammitglieder automatisch.
Die beste Prävention: kurze lokale Projektpfade
Die Aktivierung langer Pfade ist sinnvoll, aber sie löst nicht jedes Problem. Nicht jede Anwendung, jedes Archivierungswerkzeug oder jede IDE-Komponente unterstützt lange Pfade vollständig.
Die wirksamste Prävention ist deshalb ein kurzer Projektstammordner.
Ungünstige Struktur
C:\Users\Anna\Documents\Projekte\Kunden\Unternehmen\Produkt\Backend\Repository
Günstige Struktur
C:\src\produkt
oder:
D:\code\produkt
Ein kurzer Basisordner schafft viel Reserve für Abhängigkeiten, generierte Dateien und tief verschachtelte Testdaten.
Für diesen Kurs bietet sich beispielsweise folgende Struktur an:
C:\src\git-kurs
Ein neues Repository klonst du dann etwa so:
cd /c/src
git clone git@github.com:beispielorganisation/git-kurs.git
Das Ergebnis:
C:\src\git-kurs
Empfehlungen für Teams
- Lege einen dokumentierten Arbeitsordner fest, etwa
C:\srcoderD:\code. - Vermeide sehr lange Repository-Namen.
- Halte Verzeichnisnamen verständlich, aber kompakt.
- Prüfe generierte Ausgaben auf unnötig tiefe Strukturen.
- Versioniere
vendorin PHP-Projekten in der Regel nicht. Composer erzeugt den Ordner lokal oder in der CI. - Berücksichtige lange Pfade bei ZIP-Archiven, Deployment-Werkzeugen und Build-Prozessen.
Pfadlängen gezielt untersuchen
PowerShell kann lange Dateipfade im aktuellen Projekt finden. Wechsle zunächst in das Repository:
Set-Location C:\src\git-kurs
Anschließend lassen sich besonders lange Pfade auflisten:
Get-ChildItem -Recurse -Force |
Sort-Object { $_.FullName.Length } -Descending |
Select-Object -First 20 FullName, @{Name="Laenge"; Expression={ $_.FullName.Length }}
Damit erhältst du die zwanzig längsten Pfade samt Zeichenanzahl.
Um nur Pfade ab 240 Zeichen anzuzeigen:
Get-ChildItem -Recurse -Force |
Where-Object { $_.FullName.Length -ge 240 } |
Select-Object FullName, @{Name="Laenge"; Expression={ $_.FullName.Length }}
Die Grenze von 240 Zeichen ist bewusst etwas niedriger als das klassische Limit. Der verbleibende Spielraum schützt vor zusätzlichen Zeichen, die Werkzeuge temporär erzeugen können.
Dateirechte: Windows und Unix denken unterschiedlich
Auf Linux und macOS besitzen Dateien klassische Unix-Modi. Besonders wichtig ist dabei das Ausführungsbit:
-rwxr-xr-x
Die drei Gruppen stehen für:
- Eigentümer
- Gruppe
- andere Benutzer
Das x bedeutet: Die Datei darf als Programm oder Skript ausgeführt werden.
Unter Windows steuern dagegen NTFS-Berechtigungen den Zugriff. Diese sind wesentlich detaillierter und beziehen sich auf Benutzer, Gruppen und Zugriffsarten wie Lesen, Schreiben oder Ändern.
Eine typische Windows-Datei besitzt daher nicht einfach ein Unix-Ausführungsbit. Ob eine Datei gestartet werden kann, hängt unter anderem von Folgendem ab:
- Dateiendung, etwa
.exe,.bat,.cmdoder.ps1 - NTFS-Berechtigungen
- PowerShell-Ausführungsrichtlinien
- Zuordnung zu installierten Programmen
- Sicherheitsmechanismen wie Microsoft Defender SmartScreen
Git kann die vollständigen Windows-ACLs nicht sinnvoll und plattformübergreifend versionieren. Stattdessen speichert Git im Normalfall nur eine vereinfachte Dateimodus-Information.
Das Ausführungsbit in Git
Git unterscheidet bei regulären Dateien vor allem zwischen zwei Modi:
100644
Dies beschreibt eine normale, nicht ausführbare Datei.
100755
Dies beschreibt eine ausführbare Datei.
Weitere häufige Modi sind:
040000
Ein Verzeichnis beziehungsweise ein Tree-Objekt.
120000
Ein symbolischer Link.
Die Modusangaben sind Teil des Git-Index und damit Teil eines Commits. Deshalb bleiben sie beim Klonen und zwischen Betriebssystemen erhalten.
Ein Shell-Skript kann unter Linux beispielsweise ausführbar sein:
scripts/deploy.sh
In Git wäre es dann als 100755 gespeichert. Ein Windows-Entwickler kann den Inhalt bearbeiten und committen, ohne das Ausführungsbit zwangsläufig zu verändern — sofern Git passend konfiguriert ist.
core.filemode unter Windows
Die Einstellung core.filemode legt fest, ob Git Änderungen am Ausführungsbit im Arbeitsverzeichnis erkennen soll.
Prüfe den aktuellen Wert:
git config --get core.filemode
Auf Windows ist häufig dieser Wert sinnvoll:
false
Falls kein Wert ausgegeben wird, prüfe alle Konfigurationsebenen:
git config --show-origin --get-all core.filemode
Mit folgendem Befehl ignoriert Git lokale Änderungen am Ausführungsbit:
git config --global core.filemode false
Das ist für die meisten Windows-Arbeitsplätze empfehlenswert, weil NTFS und Git Bash Dateimodi nicht immer so abbilden wie ein Linux-Dateisystem.
Wichtig:
core.filemode falseentfernt keine bereits versionierten Ausführungsrechte. Es verhindert lediglich, dass Git lokale Änderungen an diesem Bit als Arbeitsverzeichnisänderung meldet.
Beispiel: Unerwartete Modusänderung
Angenommen, ein Skript wurde auf einem Linux-System ausführbar gemacht. Git zeigt dann unter Umständen:
old mode 100644
new mode 100755
Oder umgekehrt:
old mode 100755
new mode 100644
Wenn diese Änderung beabsichtigt ist, kann sie normal committed werden. Wenn sie nur durch die lokale Umgebung entstanden ist, sollte sie nicht versehentlich in einen Commit gelangen.
Prüfe stets zuerst den Status:
git status
Untersuche anschließend den Unterschied:
git diff --summary
Eine reine Rechteänderung erscheint beispielsweise so:
mode change 100644 => 100755 scripts/deploy.sh
Ausführungsrechte bewusst mit Git setzen
Wenn ein Skript auf Linux-Servern, in Docker-Containern oder in GitHub Actions direkt ausgeführt werden soll, setze das Ausführungsbit explizit in Git.
Datei ausführbar machen
git update-index --chmod=+x scripts/deploy.sh
git commit -m "chore: make deployment script executable"
Ausführungsbit entfernen
git update-index --chmod=-x scripts/deploy.sh
git commit -m "chore: remove executable permission from deployment script"
Kontrolliere die Änderung:
git diff --cached --summary
Beispiel:
mode change 100644 => 100755 scripts/deploy.sh
Diese Befehle sind besonders nützlich, weil sie das gewünschte Git-Metadatum direkt setzen — unabhängig davon, wie Windows die Datei im lokalen Dateisystem behandelt.
Rechte eines bereits committeten Pfads prüfen
git ls-tree HEAD scripts/deploy.sh
Mögliche Ausgabe:
100755 blob 1234567890abcdef1234567890abcdef12345678 scripts/deploy.sh
Die führende Angabe 100755 bestätigt, dass Git die Datei als ausführbar speichert.
Relevanz für PHP-Projekte
PHP-Dateien benötigen unter Windows normalerweise kein Ausführungsbit. Sie werden über den PHP-Interpreter gestartet:
php bin/console
Auf Linux kann dieselbe Datei jedoch direkt ausführbar sein:
./bin/console
Damit die zweite Variante funktioniert, braucht die Datei in der Regel:
-
Eine Shebang-Zeile, etwa:
#!/usr/bin/env php -
Das Ausführungsbit
100755in Git.
Das gilt häufig für:
- CLI-Werkzeuge in
bin/ - Deployment-Skripte in
scripts/ - Shell-Skripte mit der Endung
.sh - Entwicklerwerkzeuge und Generatoren
- CI-Hilfsskripte
Für eine reine PHP-Klassendatei wie src/Service/UserService.php wäre ein Ausführungsbit dagegen ungewöhnlich und sollte geprüft werden.
Windows-Attribute sind keine Git-Dateirechte
Windows kennt Attribute wie:
- schreibgeschützt
- versteckt
- Systemdatei
- Archiv
Diese Attribute sind nicht mit Unix-Dateirechten gleichzusetzen. Git versioniert sie im Normalfall nicht.
Ein schreibgeschütztes Attribut kann jedoch lokale Git-Operationen stören, etwa beim Auschecken, Zurücksetzen oder Wechseln eines Branches. Wenn Git eine Datei nicht überschreiben kann, prüfe zunächst die Windows-Eigenschaften der Datei.
In PowerShell:
Get-Item .\config\settings.php | Select-Object Name, Attributes
Ein schreibgeschütztes Attribut lässt sich entfernen:
attrib -R .\config\settings.php
Für ein gesamtes Verzeichnis einschließlich Unterordnern:
attrib -R .\temp\* /S /D
⚠️ Entferne Attribute nur in Projektordnern, deren Inhalt du kennst. Systemordner und fremde Verzeichnisse sollten nicht pauschal verändert werden.
NTFS-Berechtigungen bei Zugriffsproblemen prüfen
Wenn Git Fehler wie „Permission denied“, „Access is denied“ oder „unable to unlink“ meldet, liegt die Ursache häufig nicht bei Git selbst. Häufige Gründe sind:
- Eine Datei ist in PhpStorm, einem Terminal oder einem anderen Programm gesperrt.
- Ein Virenscanner untersucht oder blockiert die Datei.
- Der Projektordner gehört einem anderen Windows-Benutzer.
- Das Repository liegt in einem geschützten Ordner.
- Der Ordner befindet sich in OneDrive, einem Netzlaufwerk oder einem synchronisierten Unternehmensspeicher.
- Die NTFS-Berechtigungen erlauben keinen Schreibzugriff.
Zeige die Berechtigungen eines Ordners an:
Get-Acl C:\src\git-kurs | Format-List
Alternativ:
icacls C:\src\git-kurs
Für persönliche Entwicklungsprojekte ist ein lokaler Ordner wie C:\src meist robuster als:
C:\Program Files
C:\Windows
C:\Users\Name\OneDrive\Dokumente
Geschützte Systemordner und synchronisierte Ordner erhöhen die Wahrscheinlichkeit für Berechtigungs-, Sperr- und Synchronisationsprobleme.
Dateisperren unter Windows erkennen
Windows erlaubt es Anwendungen häufig, Dateien exklusiv zu sperren. Das unterscheidet sich von vielen Linux-Workflows, bei denen Dateien während der Bearbeitung leichter ersetzt oder gelöscht werden können.
Wenn Git eine Datei nicht löschen oder überschreiben kann:
- Schließe geöffnete Editoren, Vorschauprogramme und Terminals.
- Beende gegebenenfalls PhpStorm vollständig.
- Prüfe laufende PHP-, Node.js-, Composer- oder Testprozesse.
- Warte kurz, falls Microsoft Defender die Datei prüft.
- Wiederhole erst danach den Git-Befehl.
Bei hartnäckigen Sperren kann der Windows-Ressourcenmonitor helfen:
- Öffne den Task-Manager.
- Wähle Leistung.
- Öffne den Ressourcenmonitor.
- Wechsle zu CPU.
- Suche im Bereich Zugeordnete Handles nach dem Dateinamen.
So lässt sich feststellen, welcher Prozess eine Datei oder ein Verzeichnis verwendet.
PhpStorm und Dateirechte
PhpStorm zeigt Änderungen an Dateiinhalten und Git-Metadaten im Commit-Werkzeugfenster an. Eine Modusänderung kann dort als eigener Änderungstyp erscheinen.
Vor einem Commit solltest du daher nicht nur die Dateinamen, sondern auch die Diff-Ansicht kontrollieren:
- Öffne das Werkzeugfenster Commit.
- Wähle die geänderte Datei.
- Prüfe, ob neben Inhaltsänderungen auch eine Modusänderung vorliegt.
- Übernimm Rechteänderungen nur, wenn sie fachlich gewollt sind.
Für Shell-Skripte und Linux-CLI-Werkzeuge ist die Kommandozeile oft eindeutiger:
git diff --summary
git ls-tree HEAD -- scripts/deploy.sh
PhpStorm kann Windows-NTFS-Berechtigungen nicht als plattformübergreifende Git-Regel verwalten. Die maßgebliche Information für das Repository bleibt der Git-Dateimodus.
Empfohlene Git-Konfiguration für einen Windows-Entwicklungsrechner
Für eine typische lokale Entwicklungsumgebung unter Windows 11 sind diese Einstellungen ein sinnvoller Ausgangspunkt:
git config --global core.longpaths true
git config --global core.filemode false
Prüfe beide Werte:
git config --global --get core.longpaths
git config --global --get core.filemode
Erwartete Ausgabe:
true
false
Diese Konfiguration bedeutet:
- Git akzeptiert lange Pfade, soweit Windows und die verwendeten Werkzeuge dies unterstützen.
- Git meldet lokale Änderungen am Ausführungsbit nicht unnötig als Änderung.
- Bereits im Repository gespeicherte Ausführungsrechte bleiben erhalten.
- Bewusste Rechteänderungen können weiterhin mit
git update-index --chmodvorgenommen werden.
Diagnoseablauf bei Problemen
Wenn ein Checkout, Pull oder Branch-Wechsel auf Windows scheitert, arbeite strukturiert statt Befehle mehrfach zu wiederholen.
Bei einem Pfadlängenfehler
-
Prüfe die Git-Einstellung:
git config --get core.longpaths -
Aktiviere sie bei Bedarf:
git config --global core.longpaths true -
Prüfe, ob lange Pfade in Windows aktiviert sind.
-
Klone oder verschiebe das Repository in einen kurzen Pfad, etwa:
C:\src\projekt -
Prüfe besonders lange Pfade mit PowerShell.
-
Aktualisiere bei Bedarf Git for Windows und PhpStorm.
Bei einem Rechte- oder Zugriffsfehler
-
Prüfe den Repository-Zustand:
git status -
Schließe Programme, die Dateien sperren könnten.
-
Prüfe, ob das Projekt in OneDrive oder einem geschützten Ordner liegt.
-
Prüfe NTFS-Berechtigungen:
icacls C:\src\projekt -
Prüfe schreibgeschützte Attribute:
Get-Item .\betroffene-datei | Select-Object Name, Attributes -
Prüfe bei reinen Modusänderungen:
git diff --summary -
Setze bei Bedarf das Ausführungsbit gezielt über Git statt über Windows-Dateieigenschaften.
Praxisübung: Umgebung absichern
Lege ein kurzes lokales Arbeitsverzeichnis an:
New-Item -ItemType Directory -Path C:\src -Force
Wechsle dorthin:
Set-Location C:\src
Aktiviere die relevanten Git-Einstellungen:
git config --global core.longpaths true
git config --global core.filemode false
Prüfe die Konfiguration einschließlich ihrer Herkunft:
git config --show-origin --get-all core.longpaths
git config --show-origin --get-all core.filemode
Erstelle ein kleines Test-Repository:
mkdir git-windows-test
cd git-windows-test
git init
Lege ein Skript an:
echo echo Deployment > deploy.sh
Mache es bewusst ausführbar:
git add deploy.sh
git update-index --chmod=+x deploy.sh
git commit -m "chore: add executable deployment script"
Prüfe abschließend den gespeicherten Dateimodus:
git ls-tree HEAD deploy.sh
Die Ausgabe sollte mit 100755 beginnen.
Merkpunkte
- Kurze Projektpfade sind die zuverlässigste Vorbeugung gegen Pfadprobleme.
- Aktiviere lange Pfade sowohl in Windows als auch in Git mit
core.longpaths. - Verwende für lokale Projekte vorzugsweise Pfade wie
C:\src\projekt. - Git speichert keine vollständigen Windows-NTFS-Berechtigungen.
- Für Git ist vor allem das Unix-Ausführungsbit relevant:
100644oder100755. - Setze Ausführungsrechte für plattformübergreifende Skripte bewusst mit
git update-index --chmod. - Mit
core.filemode falsevermeidest du auf Windows unnötige lokale Modusänderungen. - Bei „Access denied“ sind Dateisperren, Virenscanner, OneDrive oder NTFS-Berechtigungen oft die eigentliche Ursache.