\r В конце имени файла, ошибка. Как исправить php\r, bash\r, *.sh\r (/usr/bin/env: 'php\r': No such file or directory )

Проблема

/usr/bin/env: 'php\r': No such file or directory

проблема наблюдалась при запуске команд терминала для симфони в windows 10 (сам проект запущен в контейнере linux, но git делал выгрузку в винду, что приводит по-умолчанию к конвертации символа окончания строки).

Проблема связана с разными переносами строк в разных ОС, и тем как Git работает с этими различиями.

Быстрая правка: Починка конкретного скрипта

В нашем случае алгоритм простой для решения проблемы на виндоус в случае, если мы хотим запустить конкретный файл в линукс-окружении -просто переформатировать его окончания строк в юникс-стиль, для этого запускаем power shell и выполняем 2 команды

$path = "C:\путь\к\файлу"
(Get-Content $path -Raw).Replace("`r`n","`n") | Set-Content $path -Force

Решение: Отказ от конвертации окончаний строк на локальной машине (в windows)

Тут делаем два действия:

  • Настраиваем ваш текстовый редактор (или IDE) для отображения переноса по \n (в лиункс-стиле)
  • И для гита выполняем:
    git config --global core.autocrlf false

    -- таким образом мы говорим гиту не конвертировать окончания строк в виндос-стиль.

далее можно поправить имеющийся файл (если проблема в одному файле) способом описанным выше (power shell) или заново выкачать репозиторий (также можно проверить более быстрый вариант с git checkout . -- но я его не проверял, вообще любой способ заново вытащить все файлы без конвертирования окончаний строк).

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

Решение: Запрет конвертации без явной перенастройки локальных машин

Вы можете указать какое окончания использовать для специфических файлов при выгрузке в локальную файловую систему, для это в корень проекта можно положить файл .gitattributes с содержимым вроде:

# Конкретный файл без расширения
bin/console eol=lf
# все bash скрипты по расширению
*.sh  eol=lf

-- тут мы сначала указываем на конктреный файл баш стрипта, так как он нам нужен в неотконвертированном виде в любой системе (в данном случае это скрипт console из bin), а потом инструкцией:

*.sh  eol=lf

запрещаем конвертировать окончания строк во всех баш-скрипнтах с расширением .sh

Если у вас уже наблюдается ошибка то, тут можно как и в описаниях выше, любым способом вытащить из индекса гит-а ещё раз состояние, но теперь уже с учетом новых правил конвертации из .gitattributes

Источники: