Удаление возврата каретки (^M) из определенных строк без изменения каждой строки
У меня есть довольно длинные файлы C++, и git diff --check
сообщает, что есть несколько возвратов каретки ^M
примерно на 15 разных линиях. Это на машине с Windows 7. После поиска нескольких решений, например, Visual Studio Advanced Save Options
или преобразования EOL в Notepad ++, похоже, что все они модифицируют каждую строку, а не только те, на которые жалуется Git. Это приводит к замене git diff каждой строки.
Может ли это быть потому, что все предыдущие изменения в этих файлах также имели возврат каретки ^M
а предыдущие коммиты игнорировали какие-либо предупреждения о возврате каретки?
Бег git config core.autocrlf
возвращает true, но при запуске файла ничего не происходит git diff --cached --check
для этого файла после постановки.
Есть ли способ их удалить? Вручную идти к линии и пытаться измениться, кажется, не помогает.
4 ответа
15 строк?
В блокноте ++ выберите заменить. Выбрал расширенный. Найдите \ r (то есть ^ M) и замените его ничем (если вы не хотите новую строку, затем замените \ n). Поскольку вы не хотите, чтобы все ^ M были заменены, не нажимайте "заменить все", выберите те, которые вы хотите заменить.
Если вы используете обычный блокнот Windows, ^ M будут отображаться в виде блоков. Вы можете удалить коробки. Уродливо, но это работает.
Использование dos2unix <file>
если в командной строке. Он исправит необходимые окончания строки или ничего не сделает, если ничего не нужно. Сделать find . -name "*.cpp" -exec dos2unix {} +
сделать несколько файлов. Тогда сравните с git diff
перед фиксацией
Лучше всего избегать использования в файлах смешанных окончаний строк. Это может сделать слияние и последующую историю неловкими.
Некоторые редакторы не меняют стиль, но я думаю, что если хотя бы один ^M попадет в файл, некоторые редакторы примут стиль DOS и изменят все окончания строк при написании файла.
Обычно можно найти настройки для редакторов, которые позволят редактору придерживаться желаемого стиля. Конец строки и настройки табуляции также обычно устанавливаются в зависимости от стиля.
Git может сделать это автоматически git config --global core.autocrlf true
, Но он делает это во время проверки или фиксации времени. Так что git не будет показывать поэтапные изменения, но должен спокойно позаботиться о преобразовании, если ваш редактор вводит некоторые новые нежелательные окончания строк.
Я думаю, что используйте dos2unix, если нежелательные окончания строки уже находятся в хранилище.
Для получения дополнительной информации см. Ответ здесь: https://stackoverflow.com/questions/10418975/how-to-change-line-ending-settings и прочитайте http://git-scm.com/book/en/Customizing-Git-Git-Configuration
На машине с Windows вы можете сделать, например:
for /r %f in (*.js) do "c:\Program Files\git\usr\bin\dos2unix.exe" %f
это удалит CR из всех файлов с расширением.js из текущего каталога