Слишком длинное имя файла в Git для Windows

405

Я использую Git-1.9.0-preview20140217 для Windows. Как я знаю, этот выпуск должен решить проблему со слишком длинными именами файлов. Но не для меня.

Конечно, я делаю что-то не так: я сделал git config core.longpaths true и git add. и затем git commit. Все прошло гладко. Но когда я сейчас делаю состояние git status, я получаю список файлов с Filename too long, например:

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

Для меня это довольно просто воспроизвести: просто создайте веб-приложение Yeoman с генератором углов ("yo angular") и удалите node_modules из файла .gitignore. Затем повторите вышеупомянутые команды Git.

Что мне здесь не хватает?

  • 0
    Где вы читаете, что эта версия должна исправить длинные имена файлов?
  • 0
    Вот запрос на извлечение патча: github.com/msysgit/git/pull/122
Показать ещё 3 комментария
Теги:

12 ответов

232
Лучший ответ

Git имеет ограничение в 4096 символов для имени файла, за исключением Windows, когда Git компилируется с помощью msys. Он использует более старую версию Windows API и имеет ограничение в 260 символов для имени файла.

Так что, насколько я понимаю, это ограничение msys, а не Git. Вы можете прочитать подробности здесь: https://github.com/msysgit/git/pull/110

Вы можете обойти это, используя другой клиент Git в Windows или установив для core.longpaths значение true как описано в других ответах.

git config --system core.longpaths true

Git собран как комбинация скриптов и скомпилированного кода. С указанным выше изменением некоторые скрипты могут потерпеть неудачу. Это причина того, что core.longpaths не должен быть включен по умолчанию.

Документация Windows по адресу https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file содержит дополнительную информацию:

Начиная с Windows 10 версии 1607 ограничения MAX_PATH были удалены из общих функций файлов и каталогов Win32. Тем не менее, вы должны подписаться на новое поведение.

Раздел реестра позволяет вам включить или отключить новое поведение длинного пути. Чтобы включить поведение длинного пути, установите ключ реестра в HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Тип: REG_DWORD)

  • 0
    Насколько я понимаю, этот встроенный запрос на удаление ( github.com/msysgit/git/pull/122 ) должен быть исправлен.
  • 0
    Ну да и нет. Прочитайте часть в config.txt здесь: github.com/msysgit/git/pull/122/files Мой совет, не включайте это. Ваша проблема со статусом git может быть одной из "нескольких странностей", о которых предупреждают.
Показать ещё 12 комментариев
983

Вы должны быть в состоянии выполнить команду

git config --system core.longpaths true

или добавьте его в один из файлов конфигурации Git вручную, чтобы включить эту функцию, если вы используете поддерживаемую версию Git. Похоже, может быть 1.9.0 и после.

  • 13
    Эта опция конфигурации исправила проблему для меня, даже с msys, как упомянуто в принятом ответе. (В частности, версия 1.9.4.msysgit.2).
  • 5
    Sourcetree ведет себя немного странно, если только вы «не убедитесь, что SourceTree использует системный Git, а не встроенный». - Спасибо Матей Дролк за этот совет
Показать ещё 9 комментариев
160

Это может помочь:

git config core.longpaths true

Основное объяснение: В этом ответе предлагается не применять такие настройки к глобальной конфигурации системы (ко всем проектам, избегая --system или --global). Эта команда только решает проблему, будучи специфичной для текущего проекта.

  • 8
    Здесь отметили, что этот параметр может привести к непредсказуемому поведению, поэтому кажется, что предпочтительнее использовать вышеуказанную команду в качестве локального параметра в проектах, где это требуется, вместо добавления --system которая будет применять ее ко всем проектам.
  • 3
    эй, это всего лишь копия другого высоко одобренного ответа. может как минимум объяснить, почему вы предпочитаете удалить опцию --system ..
47

Создайте.gitconfig и добавьте

[core]
longpaths = true

Вы можете создать файл в местоположении проекта (не уверен), а также в глобальном местоположении. В моем случае это C:\Users\{name}\.

  • 6
    Вы также можете сделать это с помощью следующей команды: git config --global core.longpaths true
  • 0
    git config --global core.longpaths правда работал для меня, спасибо
Показать ещё 2 комментария
31

Лучшее решение - включить параметр longpath из Git.

git config --system core.longpaths true

Но обходной путь, который работает, - это удалить папку node_modules из Git:

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

Добавьте node_modules в новую строку внутри файла.gitignore. После этого нажмите ваши модификации:

$ git add .gitignore
$ git commit -m "node_modules removed"
$ git push
  • 2
    Есть веская причина оставить папку node_modules в git: если вы хотите, чтобы ваше программное обеспечение работало так же после года, когда модули потенциально исчезли из npm.
  • 0
    @cfstras, если в какой-то библиотеке есть уязвимости, и вы не обновляете периодически, конечно, у вас будут проблемы с безопасностью.
Показать ещё 3 комментария
26

Шаги, чтобы следовать:

  1. Запустите Git Bash от имени администратора
  2. Запустите команду git config --system core.longpaths true

Подробнее о git config читайте здесь.

25

Чтобы быть уверенным, что он вступает в силу сразу после инициализации репозитория, но до того, как удаленная история будет извлечена или какие-либо файлы извлечены, безопаснее использовать ее следующим образом:

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

-c key = значение

Задайте конфигурационную переменную во вновь создаваемом репозитории; это вступает в силу сразу после инициализации репозитория, но перед извлечением удаленной истории или извлечением любых файлов. Ключ находится в том же формате, что и ожидалось git -config 1 (например, core.eol = истина). Если для одного и того же ключа задано несколько значений, каждый значение будет записано в файл конфигурации. Это делает его безопасным для Например, чтобы добавить дополнительные исправления refetch к удаленному источнику.

Дополнительная информация

4

Вы также можете попытаться включить длинные пути к файлам.

Если вы используете Windows 10 Home Edition, вы можете изменить реестр, чтобы включить длинные пути.

Перейдите в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem в regedit а затем установите для LongPathsEnabled значение 1.

Если у вас Windows 10 Pro или Enterprise, вы также можете использовать локальные групповые политики.

Перейдите в Конфигурация компьютера → Административные шаблоны → Система → Файловая система в gpedit.msc, откройте "Включить длинные пути Win32" и установите для него значение "Включено".

  • 3
    Я считаю, что это должно быть сделано в сочетании с git config, и стоит отметить, что он не работает с Windows Explorer по причинам, указанным здесь .
4

Переместить репозиторий в корень вашего диска (временное исправление)

Вы можете попытаться временно переместить локальный репозиторий (всю папку) в корень диска или как можно ближе к корню.

Поскольку путь в корне диска меньше, это иногда устраняет проблемы.

В Windows я бы переместил это в C:\ или другой корень диска.

  • 2
    Это единственное, что решило мою проблему. У меня было слишком много папок в пути.
  • 0
    Это не будет работать, если путь очень длинный
Показать ещё 1 комментарий
2

У меня тоже была эта ошибка, но в моем случае причиной была устаревшая версия npm v1.4.28.

Обновление до npm v3 с последующим

rm -rf node_modules
npm -i

работал на меня. В выпуске npm 2697 содержатся подробные сведения о "максимально плоской" структуре папок, включенной в npm v3 (выпущена 2015-06-25).

1

Если вы работаете с зашифрованным разделом, рассмотрите возможность перемещения папки в незашифрованный раздел, например, /tmp, запуска git pull, а затем возврата назад.

0

Выполнение git config --system core.longpaths true мне ошибку:

"ошибка: не удалось заблокировать файл конфигурации C:\Program Files (x86)\Git\mingw32/etc/gitconfig: разрешение запрещено"

Исправлено с выполнением команды на глобальном уровне:

git config --global core.longpaths true
  • 0
    Глобальные настройки влияют только на текущего пользователя, тогда как системные настройки влияют на всех пользователей на машине. Если это ваша рабочая станция, они фактически такие же, как вы можете использовать только одного пользователя.
  • 0
    Если вы используете приложение командной строки от имени администратора, первая команда будет работать!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню