У меня есть несколько довольно длинных файлов 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 из текущего каталога и ниже