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

665

я использую 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.

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

Папа муфлон
источник
Где вы читаете, что эта версия должна исправить длинные имена файлов?
iveqy
Вот запрос на извлечение патча: github.com/msysgit/git/pull/122
Папа Муффлон,
@PapaMufflon Вы можете изменить принятый ответ на тот, у которого больше баллов? Это мне очень помогло.
v.karbovnichy
@ v.karbovnichy, пожалуйста, внимательно прочитайте мой вопрос. Я уже выполнил команду в топе проголосовавшего ответа. Но в то время, когда я задавал вопрос, принятый ответ был правильным: у msys все еще было это ограничение характера. Теперь, когда это ограничение прошло, git config core.longpaths true работает так, как должно.
Папа Муфлон
Хорошо, тогда я согласен
v.karbovnichy

Ответы:

707

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.longpath не включается по умолчанию.

Документация 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)

iveqy
источник
19
Ограничение 260 символов в пути не является специфическим для MSYS, это обычная имитация Windows API. Эту проблему можно обойти, используя пути Unicode, но у этого есть и другие недостатки, поэтому core.longpathsпо умолчанию он не включен. Также обратите внимание, что Git для Windows не скомпилирован с MSYS. Вместо этого это родное приложение Windows, которое поставляется с урезанной средой MSYS.
sschuberth
3
@sschuberth: Есть ли недостатки, кроме несовместимости с программами, которые не поддерживают длинные пути?
JAB
3
@JAB Другим недостатком является то, что длинные пути всегда должны быть абсолютными; относительные пути не поддерживаются. Для получения дополнительной информации, пожалуйста, смотрите здесь .
Щуберт
4
Или как быстрое решение, просто попробуйте оформить репозиторий в C: / на окнах, тем самым уменьшив количество символов пути к папке.
Акшай Локур
5
К вашему сведению, к настоящему времени проблема все еще сохраняется. Мы могли бы рассмотреть возможность продолжения разработки на реальной операционной системе ...
Géza Török
1035

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

git config --system core.longpaths true

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

sparkym3
источник
13
Эта опция конфигурации исправила проблему для меня, даже с msys, как упомянуто в принятом ответе. (В частности, версия 1.9.4.msysgit.2).
Алекс Осборн
5
Sourcetree ведет себя немного странно, если только вы «не убедитесь, что SourceTree использует системный Git, а не встроенный». - Спасибо Матею Дролку за этот совет
bstoney
38
Вот некоторая справочная информация, почему это не включено по умолчанию, и некоторые технические детали.
sschuberth
12
get "не удалось заблокировать конфигурационный файл C: \ Program Files \ Git \ mingw64 / etc / gitconfig" после запуска команды выше. Но ответ @ Yash работал для меня
divByZero
10
@divideByZero при запуске git bash от имени администратора предотвращает эту ошибку.
Ник
205

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

git config core.longpaths true

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

Сагируддин Мондал
источник
13
Люди здесь отметили, что этот параметр может привести к непредсказуемому поведению, поэтому кажется, что предпочтительнее использовать вышеуказанную команду в качестве локального параметра в проектах, где это требуется, а не в добавлении, --systemкоторое применимо ко всем проектам
Грант Хамфрис
4
эй, это всего лишь копия другого высоко одобренного ответа. может, по крайней мере, объяснить, почему вы предпочитаете удалить опцию --system ..
Феликс Ганьон-Гренье
79

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

[core]
longpaths = true

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

Яши
источник
10
Вы также можете сделать это с помощью следующей команды:git config --global core.longpaths true
Вьющиеся
git config --global core.longpaths правда работал для меня, спасибо
Рама Кришна Ила
1
При использовании Visual Studio приведенные выше решения git bash не сработали, но я нашел файл .git / config для проекта и редактирование, как показано выше. Спасибо, яш.
Эндрю Пэйт
это сработало для меня, я нашел этот файл и изменил его вручную
нашел
1
Вышеупомянутые и проверенные ответы верны, но с разрешениями, которые предоставляются файлу, может быть невозможно обновить файл этими командами. Этот подход действительно прост, потому что это ручной подход, и он работал очень хорошо для меня. Вы можете легко найти .gitconfigфайл по следующему пути C:\Users\{username}и просто отредактировать его.
Кавинду Наратхота
53

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

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

Примечание : если шаг 2 не работает или выдает какую-либо ошибку, вы также можете попробовать выполнить эту команду:

git config --global core.longpaths true

Подробнее о git config здесь .

Saikat
источник
35

Лучшее решение - включить параметр 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
Джандерсон Сильва
источник
3
Есть веская причина оставить папку node_modules в git: если вы хотите, чтобы ваше программное обеспечение работало так же после года, когда модули потенциально исчезли из npm.
cfstras
@cfstras, если в какой-то библиотеке есть уязвимости, и вы не обновляете периодически, конечно, у вас будут проблемы с безопасностью.
Джандерсон Сильва
1
Конечно, вы должны обновить свои зависимости. Но только когда вы захотите, и если что-то сломается, вы захотите
создать
Правда. Я отредактирую свой ответ. Спасибо за ваш комментарий.
Джандерсон Сильва
1
Не нужно фиксировать node_modules: packages.lockфайл находится здесь, чтобы гарантировать, что установленная версия npm installвсегда будет одинаковой, пока вы не сделаетеnpm update
Pierre-Olivier
32

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

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

-c ключ = значение

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

Больше информации

часовщик
источник
24

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

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

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

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

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

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

Войдите HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemв regeditи затем установите LongPathsEnabledв1 .

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

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

Джулиан Виркамп
источник
5
Я считаю, что это должно быть сделано в сочетании с git config, и стоит отметить, что он не работает с Windows Explorer по причинам, указанным здесь .
Neo
11
git config --global core.longpaths true

Вышеуказанная команда работала для меня. Использование '--system' дало мне ошибку в файле конфигурации без блокировки

amalik2205
источник
2
для пользователей Github Desktop это единственный, который работает, потому что Github Desktop использует свою собственную конфигурацию Git.
Чаба
4

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

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

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

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

Дирадж Бхаскар
источник
2
Это единственное, что решило мою проблему. У меня было слишком много папок на пути.
J Brune
2

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

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

rm -rf node_modules
npm -i

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

Джеймс Грин
источник
1

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

augustowebd
источник
0

В машине окна

Запустите командную строку как администратор, затем выполните команду ниже

git config - system core.longpaths true

Картик Шоу
источник