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

3178
Fasih Awan

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

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

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

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

2

4 ответа на вопрос

1
gaoithe

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

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

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

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

1
gaoithe

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-конфигурации # Форматирование-и-Пробелы

0
Robert Jacobs

15 lines?

In notepad++, choose replace. Chose extended. Search for \r (which is ^M) and replace with nothing (unless you want a newline, then replace with \n). Since you do not want all ^M's replaced, do not press replace all, choose the ones you want to replace.

If you use regular windows notepad, the ^M's will show up as boxes. You can remove the boxes. Ugly, but it works.

0
kofifus

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

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

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