Являются ли линии CRLF в проекте Rails, развернутом в Linux?

У меня есть репозиторий Git (изначально CVS, а затем SVN, теперь Git), содержащий проект Rails, который был развернут в Linux некоторое время. Кажется, все работает нормально.

Теперь, когда я преобразовал в git, я вижу, что многие мои файлы в репозитории содержат CRLF окончания строки. Мне бы очень хотелось, чтобы все было последовательным (LF), но не за счет потери истории изменений для каждого файла с окончанием строки CRLF.

Можете ли вы подумать о какой-либо причине, по которой я не могу оставить файлы такими, какими они есть? Я, кажется, помню, что возникла проблема со сценариями оболочки или cron файлами или чем-то, что не отвечало на CRLF очень хорошо.

Кроме того, я знаю все о параметрах Git core.autocrlf и core.safecrlf, но есть ли способ преобразовать все текстовые файлы с CRLF в LF при проверке (для linux)... т.е. опция core.autolf или что-то подобное?

Ответ 1

Если вам нормально переписать историю вашего репозитория (см. проблемы с историей переписывания), вы можете использовать git filter-branch to конвертировать CRLF в LF:

git filter-branch --tree-filter 'find . -path './.git' -prune -o -type f -exec dos2unix \{} \;' HEAD

Обратите внимание, что если у вас есть двоичные файлы в вашем репозитории, вам придется уточнить команду find, чтобы исключить их.

Ответ 2

A comment в ответ на davitenio и комментарий Даниэля Бердсли; Я полагаю, вы могли бы использовать эту небольшую программу в качестве обертки вокруг dos2unix:

#!/bin/sh
for f in [email protected]; do
    if [ $(file -b -n -i -m /dev/null $f | grep -c "text") -gt 0 ]; then
        dos2unix $f
    fi
done

хотя, вероятно, еще есть какой-то угловой случай, который потерпит неудачу.