Search code examples
windowsgit

Filename too long in Git for Windows


I'm using Git-1.9.0-preview20140217 for Windows. As I know, this release should fix the issue with too long filenames. But not for me.

Surely I'm doing something wrong: I did git config core.longpaths true and git add . and then git commit. Everything went well. But when I now do a git status, I get a list of files with Filename too long, for example:

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

It is quite simple to reproduce for me: just create a Yeoman web application with the Angular generator ("yo angular") and remove node_modules from the .gitignore file. Then repeat the aforementioned Git commands.

What am I missing here?


Solution

  • Git has a limit of 4096 characters for a filename, except on Windows when Git is compiled with msys. It uses an older version of the Windows API and there's a limit of 260 characters for a filename.

    So as far as I understand this, it's a limitation of msys and not of Git. You can read the details here: https://github.com/msysgit/git/pull/110

    You can circumvent this by using another Git client on Windows or set core.longpaths to true as explained in other answers.

    git config --system core.longpaths true
    

    NOTE: due to https://github.com/desktop/desktop/issues/8023#issuecomment-515115353, Github Desktop (and potentially other Git GUIs as well) will read the --global config but not the --system config

    Git is build as a combination of scripts and compiled code. With the above change some of the scripts might fail. That's the reason for core.longpaths not to be enabled by default.

    The windows documentation at https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later has some more information:

    Starting in Windows 10, version 1607, MAX_PATH limitations have been removed from common Win32 file and directory functions. However, you must opt-in to the new behavior.

    A registry key allows you to enable or disable the new long path behavior. To enable long path behavior set the registry key at HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (Type: REG_DWORD)

    Appendix - Doing it all from PowerShell - the copy-paste edition

    This is a Windows specific issue, hence the solution below should work in most Windows versions, new and old.

    Open a PowerShell window/console, and run the following:

    • Setting Registry Value:
    # Check LongPathsEnabled settings
    Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled
    
    # If 0, set it to 1 - This is a System wide configuration
    # This will fail if you do not have Admin priveleges
    # Changes to CurrentControlSet\Control take effect after a system restart
    $MyPSexe = Get-Process -PID $PID | % Path
    Start-Process -Verb RunAs $MyPSexe "-c","Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled -Type DWord -Value 1"
    
    • Setting git config --system - System wide for all Windows users:
    Start-Process -Verb RunAs "git" "config","--system","core.longpaths","true"
    
    • Alternative - non admin option: Setting git config --global - User's global settings:
    & git config "--global" core.longpaths true