git pull прерван, имя файла слишком длинное


114

Я использую Windows в качестве ОС и работаю над проектом с другом, который использует Mac. Он зарегистрировал код на нашем Github.

Я пытался git вытащить все, что он делал, и он прервался с ошибками "слишком длинное имя файла" стороннего кода.

Что я могу сделать?


У этой проблемы есть два принципиально разных случая, в зависимости от вашей операции. Если репозиторий уже существует, вы можете изменить его конфигурацию. А если нет? Для клонирования / оформления заказа с созданием нового каталога поможет только ответ @AlexRosenfeld.
Гангнус

Ответы:


200

Часто задаваемые вопросы по msysgit на Git не могут создать файловый каталог с длинным путем , кажется, неактуальным, так как он все еще ссылается на старый билет msysgit № 110 . Однако, согласно более позднему билету № 122, проблема была исправлена ​​в msysgit 1.9, таким образом:

  1. Обновите до msysgit 1.9 (или новее)
  2. Запустить Git Bash
  3. Перейдите в свой репозиторий Git, который "страдает" проблемой длинных путей
  4. Включите поддержку длинных путей с помощью git config core.longpaths true

Пока что у меня это работает очень хорошо.

Обратите внимание на важную заметку в комментарии к билету №122.

не возвращайтесь сюда и не жалуйтесь, что он ломает Windows Explorer, cmd.exe, bash или любые другие инструменты, которые вы используете.


Есть несколько обновлений, похоже, есть дополнительный скрипт, который вам нужно запустить после установки mysysgit github.com/msysgit/git/pull/122#issuecomment-43653756
Адам Грант

18
На самом деле сработало: git config --global core.longpaths true
Антон Андреев

@AntonAndreev Ага, если вы хотите установить его в глобальном масштабе, это нормально. Локальная область видимости для репозитория также вполне допустима.
mloskot 01

У меня не получилось без настройки на глобальном уровне.
Антон Андреев

1
Такой способ не сработает для клонирования / оформления заказа с созданием нового каталога. Только ответ @AlexRosenfeld поможет.
Гангнус

69

Решение1 - установите глобальную конфигурацию, выполнив эту команду:

git config --system core.longpaths true

Решение2 - или вы можете напрямую отредактировать свой конкретный файл конфигурации git, как показано ниже:

YourRepoFolder -> .git -> config:

[core]
    repositoryformatversion = 0
    filemode = false
    ...
    longpaths = true        <-- (add this line under core section)

Решение3 - при клонировании нового репозитория: здесь .


1
Такой способ не сработает для клонирования / оформления заказа с созданием нового каталога. Только ответ @AlexRosenfeld поможет.
Гангнус

Я обновил ответ этим, чтобы иметь в одном месте, спасибо.
Daniel Hári

26

Несколько лет спустя, но я хотел бы добавить, что если вам нужно сделать это одним махом (как я), вы можете установить параметры конфигурации во время команды clone. Попробуй это:

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

1
Ура, дружище! Это отлично сработало при клонировании нового каталога из github.
Джей Киллин,

Без проблем рад, что помог!
xandermonkey

1
Да! Этот, а для клонирования - работает только этот!
Гангнус

Это не работает, мое клонирование по-прежнему прерывается. Я использую git version 1.8.4.msysgit.0, есть идеи?
Simple-Solution

Похоже, это устарело . Может быть, попробовать использовать git-scm? Какая у вас ошибка?
xandermonkey

12

Откройте файл your.gitconfig, чтобы добавить свойство longpaths. Это будет выглядеть так:

[core]
symlinks = false
autocrlf = true
longpaths = true

1
Такой способ не сработает для клонирования / оформления заказа с созданием нового каталога. Только ответ @AlexRosenfeld поможет.
Гангнус

6

Как человек, который постоянно сталкивался с этой проблемой с java-репозиториями в Windows, лучшим решением является установка Cygwin ( https://www.cygwin.com/ ) и использование его установки git для всех> devel> git.

Причина, по которой это лучшее решение, с которым я столкнулся, заключается в том, что Cygwin управляет длинными именами путей, поэтому другие предоставленные команды выигрывают. Пример: find, cp и rm. Поверьте мне, настоящая проблема начинается, когда вам нужно удалить слишком длинные имена путей в Windows.


4

Старайтесь, чтобы ваши файлы были ближе к корню файловой системы. Дополнительные сведения: по техническим причинам Git для Windows не может создавать файлы или каталоги, если абсолютный путь превышает 260 символов .


Похоже, что он может перейти только на 130 [возможно, в Windows используются двухбайтовые символы
Юникода

5
Больше людей должно подталкивать Microsoft к изменению этого ограничения (и исправлению устаревших API, которые они ломают). Нет причин, по которым мы все еще должны жить с этим пережитком дней, когда имена файлов были ограничены символами <8>. <3>. Если не исправить это сразу, вырывается яма побольше. Исправьте направление косой черты, пока находитесь на нем.
cchamberlain 08

@cchamberlain C: / foo / bar / baz вполне допустим, хотя \ foo \ bar \ baz также допустим (он будет относиться к любому логическому диску, на котором находится текущий рабочий каталог) / foo / bar / baz может вызвать двусмысленность с флаги командной строки.
JAB

@JAB - Верно, что косая черта иногда работает, но, как вы отметили, это ненадежно. cmd.exe будет реагировать одним способом, а PowerShell - другим. Автозаполнение перерывов. Базовый API понимает это, но cmd.exe не во всех случаях, а более безопасное использование обратной косой черты заставляет строки иногда нуждаться в экранировании. Уже существует достаточно мусора командной строки с обратной косой чертой с количеством пробелов и скобок, которые существуют в общих путях Windows.
cchamberlain

2
Это не решение. Технология должна быть слугой человека, а не человек должен быть слугой технологии.
Даниэль Хари,

4

В Windows запустите «cmd» от имени администратора и выполните команду.

"C:\Program Files\Git\mingw64\etc>"
"git config --system core.longpaths true"

или вам нужно выполнить chmod для папки, в которой установлен git.

или обновите файл вручную вручную, перейдя по пути "Git \ mingw64 \ etc"

[http]
    sslBackend = schannel
[diff "astextplain"]
    textconv = astextplain
[filter "lfs"]
    clean = git-lfs clean -- %f
    smudge = git-lfs smudge -- %f
    process = git-lfs filter-process
    required = true
[credential]
    helper = manager
**[core]
    longpaths = true**
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.