Удаление возврата каретки (^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 из текущего каталога

Другие вопросы по тегам