Следующая ситуация:
Я работаю на Mac под OS X и недавно присоединился к проекту, участники которого до сих пор используют Windows. Одной из моих первых задач была настройка кодовой базы в репозитории Git, поэтому я вытащил дерево каталогов с FTP и попытался проверить его в репозитории Git, который я подготовил локально. При попытке сделать это все, что я получил, это
fatal: CRLF would be replaced by LF in blog/license.txt.
Поскольку это влияет на все файлы в папке «блог», я ищу способ удобного преобразования ВСЕХ файлов в дереве в окончания строк Unix. Есть ли инструмент, который делает это из коробки или я сам что-то пишу?
Для справки, мой конфиг Git, касающийся окончания строк:
core.safecrlf=true
core.autocrlf=input
источник
find blog -type f | xargs dos2unix
должно быть быстрее. Вам не нужно-name *.*
ни того, ни другого, если только вам не нужны только файлы с точкой где-то в имени. Это глобус Windows, а не * nix.find
кxargs
не удастся, если в пути будутfind
сопоставлены какие-либо файлы с пробелами, кавычками или другими метасимволами оболочки. По крайней мере, использоватьfind blog -type f -print0 | xargs -0 dos2unix
для обработки пробелов. Чтобы избежать кавычек, вы должны использоватьfind
s-exec
вместо конвейера и т. Д. Страницаdos2unix
man не определяет его поведение, если вы вызываете его в двоичных файлах. Если он преобразует CRLF в двоичные файлы, он их испортит. Смотрите мой ответ для более безопасной, хотя и более длинной альтернативы.Предполагая , что вы GNU
grep
иperl
это будет рекурсивно конвертировать CRLF для LF в бинарных файлов в текущем каталоге:Как это устроено
Найти рекурсивно в текущем каталоге; изменить
.
кblog
илиwhatev
подкаталогов , чтобы ограничить замену:Сопоставлять только обычные файлы:
Проверьте, содержит ли файл CRLF. Исключить двоичные файлы. Запускает
grep
команду для каждого обычного файла. Это цена без учета двоичных файлов. Если у вас есть старый,grep
вы можете попробовать создать тест с помощьюfile
команды:Заменить CRLF на LF. С
'+'
помощью второго-exec
указываетсяfind
накапливать совпадающие файлы и передавать их одному (или как можно меньшему числу) вызовов команды, например, по конвейеруxargs
, но без проблем, если путь к файлу содержит пробелы, кавычки или другие метасимволы оболочки.i
В-pi
говорит Perl , чтобы изменить файл в месте. Вы можете использоватьsed
илиawk
здесь с некоторой работой, и вы, вероятно, измените «+» на «;» и вызвать отдельный процесс для каждого совпадения:источник
grep -qIP '\r\n'
в моей системе CentOS ничего не совпадает. Меняя это наgrep -qIP '\r$'
работало.node_modules
?find
часть команды для исключения каталогов. Они предлагают использовать-path
, но вы также можете использовать-regex
или-iregex
, то есть-not -regex '.*/node_modules/.*'
что исключитnode_modules
на любой глубине.regex
иbash
нуб, но как насчет нескольких исключений, скажем ,node_module
иdist
к примеру?-P
флага. OS X переключена с GNU grep на BSD grep. Некоторые альтернативы для OS X: stackoverflow.com/questions/16658333/…Вот лучший вариант: швейцарский нож . Он работает рекурсивно по всем подкаталогам и правильно обрабатывает пробелы и специальные символы.
Все, что вам нужно сделать, это:
Бонус: sfk также делает много других преобразований. Смотрите ниже полный список:
РЕДАКТИРОВАТЬ: слово предостережения: будьте осторожны при запуске этого на папках, которые имеют двоичные файлы, поскольку это будет эффективно уничтожать ваши файлы, особенно .git каталоги . Если это ваш случай, не запускайте sfk во всей папке, а вместо этого выбирайте конкретные расширения файлов (* .rb, * .py и т. Д.). Пример:
sfk remcr -dir chef -file .rb -file .json -file .erb -file .md
источник
sfk
эффективно обработал всю мою папку .git и уничтожил кучу двоичных файлов (отсюда мое редактирование ; не помню, был ли это Linux или Mac). Возможно, они изменили поведение по умолчанию в более поздних версиях, но я все равно рекомендую указать расширение, чтобы быть в безопасности.Это намного безопаснее, поскольку позволяет избежать повреждения вашего git-репо. Добавьте или замените .git, .svn на .bzr, .hg или любой другой источник контроля, который вы используете, в список not .
источник
На OS X это работало для меня:
Предупреждение: пожалуйста, сделайте резервную копию вашего каталога перед выполнением этой команды.
источник
Вот решение, если использовать sed:
-i
означает на месте, если вы хотите создать резервную копию, а также использовать-i.bak
's/\r$//'
заменит все возвраты каретки (\r
) в конце каждой строкиисточник