Решение ошибки «невалидный путь» при клонировании репозитория.
Данная ошибка возникала на Windows 10, при использовании Git 2.44 через Git Bash.
Но аналогичная особенность свойственна и Mac OS. Это является поведением по умолчанию самого Git, без привязки к конкретному клиенту.
Находите вы какой-нибудь интересный репозиторий на просторах интернета и решаете склонировать, чтобы поработать с ним локально, а может и внести свой вклад в open source.
Ничего не предвещает проблем, но тут неожиданно возникает ошибка:
1akorolev.dev repositories
2$ git clone git@github.com:akorolevdev/project-with-invalid-path-error.git
3Cloning into 'project-with-invalid-path-error'...
4remote: Enumerating objects: 1884, done.
5remote: Counting objects: 100% (963/963), done.
6remote: Compressing objects: 100% (485/485), done.
7remote: Total 1884 (delta 515), reused 738 (delta 390), pack-reused 921
8Receiving objects: 100% (1884/1884), 627.87 KiB | 1.61 MiB/s, done.
9Resolving deltas: 100% (778/778), done.
10error: invalid path 'licenses/LICENSE.third-party-project.txt '
11fatal: unable to checkout working tree
12warning: Clone succeeded, but checkout failed.
13You can inspect what was checked out with 'git status'
14and retry with 'git restore --source=HEAD :/'
15
16akorolev.dev repositories
17$ cd project-with-invalid-path-error/ && ls -la
18total 8
19drwxr-xr-x 1 akorolev 1049089 0 Mar 18 07:50 ./
20drwxr-xr-x 1 akorolev 1049089 0 Mar 18 07:50 ../
21drwxr-xr-x 1 akorolev 1049089 0 Mar 18 07:50 .git/
Клонирование произошло успешно, но рабочая директория не содержит ни одного файла исходного кода. Вывод команды содержит набор warning, error и fatal сообщений.
Все из-за файла с текстом лицензии одной из зависимостей, с которым нам вряд ли понадобится работать. Просто по какой-то причине имя этого файла содержит пробел в самом конце, что является нарушением соглашения об именовании в Windows .
При попытке построить рабочее дерево по коммиту из HEAD, Git обнаруживает это несоответствие с операционной системой.
А при выполнении git status
произойдет вывод длинного списка не созданных файлов в состоянии deleted
.
В описании параметров конфигурации Git можно найти специальную опцию core.protectNTFS
.
На Windows она включена по умолчанию, а для Mac OS предусмотрена аналогичная core.protectHFS
.
Отключаем и делаем сброс состояния, который сопровождается сообщением об успехе.
В сети часто предлагают отключить данную проверку на уровне глобальной конфигурации.
Но я советую делать это локально, чтобы менять поведение только по мере необходимости и быть в курсе возникновения таких ошибок в новых проектах.
1akorolev.dev project-with-invalid-path-error (main)
2$ git config --local core.protectNTFS false
3
4akorolev.dev project-with-invalid-path-error (main)
5$ git reset HEAD --hard
6HEAD is now at 2e260e3 Update README.md
Но не все так гладко, как хотелось бы. Защита, которую мы отключили, активна не просто так.
Если проверить статус, то будет замечен и побочный эффект — файл в рабочей директории создан с другим именем.
1akorolev.dev project-with-invalid-path-error (main)
2$ git status
3On branch main
4Your branch is up to date with 'origin/main'.
5
6Changes not staged for commit:
7 (use "git add/rm <file>..." to update what will be committed)
8 (use "git restore <file>..." to discard changes in working directory)
9 deleted: licenses/LICENSE.third-party-project.txt
10
11Untracked files:
12 (use "git add <file>..." to include in what will be committed)
13 licenses/LICENSE.third-party-project.txt
14
15no changes added to commit (use "git add" and/or "git commit -a")
Далее возможны различные варианты, в зависимости от конкретной ситуации. Можно зафиксировать такое переименование, как способ решения проблемы для Windows.
Если это полностью ваш личный проект или проблема локализована в отдельной feature-ветке, то можно задаться вопросом корректировки существующей истории через filter-repo
или filter-branch
.
Но в моем случае проект был open source, он активно обновляется (т.е. сообщество может не считать это проблемой), а нам этот файл не нужен в принципе для работы с кодом.
Поэтому в качестве подходящего варианта можно просто прибегнуть к sparse-checkout
, через который исключить полностью директорию licenses в нашей рабочей копии.
Источник изображения в заголовке Unsplash. Автор Zach Lezniewicz .