Ім'я файлу занадто довго в Git для Windows


663

Я використовую 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 за допомогою генератора Angular ("yo angular") та видаліть node_modulesз .gitignoreфайлу. Потім повторіть вищезгадані команди Git.

Що я тут пропускаю?


Де ви читаєте, що ця версія повинна виправляти довгі імена файлів?
iveqy

Ось запит на витяг для виправлення: github.com/msysgit/git/pull/122
Papa

@PapaMufflon Ви можете змінити прийняту відповідь на відповідь з більшою кількістю балів? Просто мені це дуже допомогло.
в.карбовничий

@ v.karbovnichy, будь ласка, уважно прочитайте моє запитання. Я вже запустив команду у верхній частині проголосованої відповіді. Але коли я задав питання, прийнята відповідь була правильною: у msys все ще було обмеження символів. Тепер, коли обмеження минуло, і git config core.longpaths справді працює як слід.
Папа Муфлон

Гаразд, згоден тоді
в.карбовничий

Відповіді:


702

Git має обмеження 4096 символів для імені файлу, за винятком Windows, коли Git компілюється з msys. Він використовує більш стару версію API Windows і має обмеження до 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)


19
Обмеження на 260 символів у шляху не є специфічним для MSYS, це загальне наслідування API API. Це можна вирішити за допомогою шляхів Unicode, але це має і інші недоліки, тому core.longpathsза замовчуванням не включено. Також зауважте, що Git для Windows він не компілюється проти MSYS. Натомість це нативне додаток для Windows, яке постачається з урізаним середовищем MSYS.
sschuberth

3
@sschuberth: Чи є якісь недоліки, крім недостатньої сумісності з програмами, які не підтримують довгі шляхи?
JAB

3
@JAB Ще одним недоліком є ​​те, що довгі шляхи завжди повинні бути абсолютними; відносні шляхи не підтримуються. Детальнішу інформацію можна отримати тут .
sschuberth

4
Або як швидке виправлення, просто спробуйте перевірити своє репо на C: / у Windows, зменшивши кількість символів шляху до папки.
Акшай Локур

5
БЮР, на сьогоднішній день питання все ще зберігається. Ми можемо розглянути можливість продовження розвитку реальної операційної системи ...
Géza Török

1033

Ви повинні мати можливість запустити команду

git config --system core.longpaths true

або додайте його в один із файлів конфігурації Git вручну, щоб увімкнути цю функціональність, коли ви перебуваєте на підтримуваній версії Git. Схоже, можливо, 1.9.0 і після.


13
Цей параметр config вирішив проблему для мене, навіть із повідомленнями msys, як зазначено у прийнятій відповіді. (Зокрема, версія 1.9.4.msysgit.2).
Алекс Осборн

5
Sourcetree діє дещо дивно, якщо ви "також не переконайтесь, що SourceTree використовує Git системи, а не вбудований". - Дякую Матей Дролк за цю пораду
bstoney

38
Ось довідкова інформація, чому це за умовчанням не ввімкнено, а також деякі технічні деталі.
sschuberth

12
отримати "не вдалося заблокувати конфігураційний файл C: \ Program Files \ Git \ mingw64 / etc / gitconfig" після запуску команди вище. Але відповідь @Yash спрацювала для мене
поділByZero

10
@divideByZero запускає git bash як адміністратор запобігає цій помилці.
Niek

204

Це може допомогти:

git config core.longpaths true

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


13
Люди тут зазначили, що цей параметр може внести деяку непередбачувану поведінку, тому, здається, перевагу використовувати вищезазначену команду як локальну установку для проектів, де це вимагає, а не додавати, --systemякі застосовуватимуться до всіх проектів
Грант Хамфріс

4
Гей, це лише копія іншої високообоснованої відповіді. можна принаймні пояснити, чому ви віддаєте перевагу видаленню опції --system ..
Фелікс Ганьон-Греньє

78

Створіть .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 файл для проекту та редагування, як показано вище. Дякую яш.
андрю паштет

це працювало для мене, я знаходив цей файл і модифікував його вручну
Patlatus

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 читайте тут .


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, якщо в деяких бібліотеках є вразливість, і ви не оновлюєтесь періодично, звичайно, у вас будуть проблеми із безпекою.
Janderson Silva

1
Звичайно, ви повинні модернізувати свої залежності. Але лише тоді, коли ви хочете, і якби щось було
зламано

Правда. Я відредагую свою віщу. Дякую за коментар
Джендерсон Сільва

1
Не потрібно робити зобов’язання node_modules: packages.lockфайл знаходиться тут, щоб гарантувати, що встановлена ​​версія npm installбуде завжди однаковою, доки ви не зробитеnpm update
П'єр-Олів'є

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, ви також можете використовувати локальну групову політику.

Перейти до Конфігурація комп'ютераАдміністративні шаблониСистемаFilesystem в gpedit.mscвідкритої Включити Win32 довгі шляхи і встановити його на Enabled .


5
Я вважаю, що це потрібно робити в поєднанні з git config, і варто зазначити, що він не працює з Windows Explorer з причин, зазначених тут .
Нео

11
git config --global core.longpaths true

Наведена вище команда працювала для мене. Використання '--system' дало мені конфігураційний файл, не заблокований помилкою


2
для користувачів Github Desktop це єдиний, який працює, оскільки Github Desktop використовує власну конфігурацію Git.
Csaba

4

Перемістити сховище до кореня вашого диска (тимчасове виправлення)

Ви можете спробувати тимчасово перемістити локальний сховище (всю папку) до кореня вашого диска або якомога ближче до кореня.

Оскільки шлях в корені диска менше, він іноді виправляє проблеми.

У Windows я б перемістив цей C:\або інший корінь диска.


2
Це єдине, що вирішило моє питання. Було так, що в мене було занадто багато папок на шляху.
Дж. Бруне

2

У мене була і ця помилка, але в моєму випадку причиною було використання застарілої версії npm, v1.4.28.

Після цього слід оновити до npm v3

rm -rf node_modules
npm -i

працював на мене. npm випуск 2697 містить детальну інформацію про "максимально рівну" структуру папок, включену в npm v3 (випущено 2015-06-25).


1

Якщо ви працюєте зі своїм зашифрованим розділом, розгляньте можливість переміщення папки до незашифрованого розділу, наприклад, a / tmp , запуску git pullта повернення назад.


0

У машині Windows

Запустіть командний рядок як адміністратор, потім запустіть нижче команди

git config --система core.longpaths вірно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.