Удаление символов возврата каретки (^M) из определенных строк без изменения каждой строки

Удаление символов возврата каретки (^M) из определенных строк без изменения каждой строки

У меня есть несколько довольно длинных файлов C++, и git diff --checkя сообщаю, что в них есть несколько возвратов каретки ^Mпримерно в 15 разных строках. Это на машине с Windows 7. После поиска нескольких решений, например Visual Studio Advanced Save Optionsили EOL Conversions Notepad++, все они, похоже, изменяют каждую строку, а не только те, на которые жалуется Git. Это приводит к git diff каждой замененной строки.

Может ли это быть связано с тем, что все предыдущие изменения в этих файлах также содержали возвраты каретки ^M, а предыдущие фиксации в них игнорировали любые предупреждения о возвратах каретки?

Выполнение git config core.autocrlfвозвращает true, но индексация файла ничего не делает, когда я запускаю git diff --cached --checkэтот файл после его индексации.

Есть ли способ их удалить? Ручной переход к линии и попытка изменить, похоже, не помогают.

решение1

15 строк?

В notepad++ выберите replace. Выберите extended. Найдите \r (то есть ^M) и замените ничем (если вам не нужна новая строка, тогда замените на \n). Поскольку вы не хотите заменять все ^M, не нажимайте replace all, выберите те, которые хотите заменить.

Если вы используете обычный блокнот Windows, ^M будут отображаться как квадратики. Вы можете удалить квадратики. Уродливо, но это работает.

решение2

Использоватьdos2unix <file>если в командной строке. Он исправит необходимые окончания строк или ничего не сделает, если ничего не нужно. Сделайте a, find . -name "*.cpp" -exec dos2unix {} +чтобы сделать несколько файлов. Затем сравните с git diffдо фиксации.

Лучше избегать смешанных окончаний строк в файлах. Это может затруднить слияние и отслеживание истории.

Некоторые редакторы не меняют стиль, но я думаю, что если в файле есть хотя бы один символ ^M, некоторые редакторы примут стиль DOS и изменят все окончания строк при записи файла.

Обычно можно найти настройки для редакторов, которые заставят редактор придерживаться нужного вам стиля. Настройки окончания строки и табуляции также обычно устанавливаются в зависимости от стиля.

решение3

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#Formatting-and-Whitespace

решение4

на машине с Windows вы можете сделать, например:

for /r %f in (*.js) do "c:\Program Files\git\usr\bin\dos2unix.exe" %f

это удалит CR из всех файлов с расширением .js из текущего каталога и ниже

Связанный контент