Запуск git на машине с Windows XP, используя bash. Я экспортировал свой проект из SVN, а затем клонировал пустой репозиторий.
Затем я вставил экспорт в пустой каталог репозиториев и сделал:
git add -A
Затем я получил список сообщений, говорящих:
LF будет заменен на CRLF
Каковы последствия этого преобразования? Это решение .NET в Visual Studio.
Ответы:
Эти сообщения из-за неправильного значения по умолчанию в
core.autocrlf
Windows.Концепция
autocrlf
заключается в прозрачной обработке преобразования концов строк. И это делает!Плохая новость : значение необходимо настроить вручную.
Хорошая новость : делать это нужно ОДИН раз за установку git (также возможна настройка каждого проекта).
Как
autocrlf
работает :Здесь
crlf
= маркер конца строки в стиле win,lf
= стиль unix (и mac osx).(pre-osx
cr
не затронут ни для одного из трех вариантов выше)Когда появляется это предупреждение (под Windows)
-
autocrlf
=true
если у вас есть Unix-стильlf
в одном из ваших файлов (= RARELY),-
autocrlf
=input
если у вас есть win-стильcrlf
в одном из ваших файлов (= почти ВСЕГДА),-
autocrlf
=false
- НИКОГДА!Что означает это предупреждение
Предупреждение « LF будет заменено на CRLF » говорит о том, что вы (имея
autocrlf
=true
) потеряете свой LF в стиле Unix после цикла фиксации (он будет заменен CRLF в стиле Windows). Git не ожидает, что вы будете использовать LF в стиле Unix под Windows.Предупреждение « CRLF будет заменен на LF » говорит о том, что вы (имея
autocrlf
=input
) потеряете свой CRLF в стиле Windows после цикла проверки-подтверждения (он будет заменен на LF в стиле Unix). Не используйтеinput
под окнами.Еще один способ показать, как
autocrlf
работаетгде x - это CRLF (в стиле Windows) или LF (в стиле Unix), а стрелки обозначают
Как исправить
Значение по умолчанию для
core.autocrlf
выбирается во время установки git и сохраняется в общесистемной gitconfig (%ProgramFiles(x86)%\git\etc\gitconfig
). Также есть (каскадирование в следующем порядке):- «глобальный» (для пользователя) gitconfig, расположенный в
~/.gitconfig
, еще один- «глобальный» (для пользователя) gitconfig в
$XDG_CONFIG_HOME/git/config
или$HOME/.config/git/config
и- «локальный» (для репо) gitconfig в
.git/config
в рабочем каталоге .Итак, напишите
git config core.autocrlf
в рабочем каталоге, чтобы проверить текущее используемое значение и- добавить
autocrlf=false
к общесистемному gitconfig # решение для системы-
git config --global core.autocrlf false
# решение для пользователя-
git config --local core.autocrlf false
# решение для проектаПредупреждения
-
git config
настройки могут быть измененыgitattributes
настройками.-
crlf -> lf
преобразование происходит только при добавлении новых файлов,crlf
файлы, уже существующие в репо, не затрагиваются.Мораль (для Windows):
- использовать
core.autocrlf
=,true
если вы планируете использовать этот проект также под Unix (и не хотите настраивать ваш редактор / IDE для использования концов строк Unix),- использовать
core.autocrlf
=,false
если вы планируете использовать этот проект только под Windows ( или вы настроили свой редактор / IDE для использования концов строк Unix),- никогда не используйте
core.autocrlf
=,input
если у вас нет веских причин ( например, если вы используете утилиты Unix под Windows или если у вас возникают проблемы с makefiles),PS Что выбрать при установке git для Windows?
Если вы не собираетесь использовать какой-либо из ваших проектов под Unix, не соглашайтесь с первым вариантом по умолчанию. Выберите третий ( Оформить заказ как есть, зафиксировать как есть ). Вы не увидите это сообщение. Когда-либо.
PPS Мое личное предпочтение - настройка редактора / IDE для использования окончаний в стиле Unix и настройка
core.autocrlf
наfalse
.источник
core.autocrlf
ввод? Из того, что я понял из вашего ответа, установка его для ввода гарантирует, что репозиторий и рабочий каталог всегда имеют окончания строк в стиле Unix. Почему вы никогда не захотите этого в Windows?У Git есть три способа обработки концов строк:
Вы можете установить используемый режим, добавив дополнительный параметр
true
илиfalse
в приведенную выше командную строку.Если
core.autocrlf
установлено значение true, это означает, что каждый раз, когда вы добавляете в репозиторий git файл, который git считает текстовым, он преобразует все окончания строки CRLF в просто LF, прежде чем сохранить его в коммите. Всякий раз, когда выgit checkout
что-то делаете , все текстовые файлы автоматически будут иметь свои окончания строк LF, преобразованные в окончания CRLF. Это позволяет разрабатывать проект на разных платформах, в которых используются разные стили окончания строки, при этом коммиты не очень шумные, поскольку каждый редактор меняет стиль окончания строки, поскольку стиль окончания строки всегда соответствует LF.Побочным эффектом этого удобного преобразования, и это то, о чем вы видите предупреждение, заключается в том, что если у созданного вами текстового файла изначально были окончания LF вместо CRLF, он будет сохранен с LF как обычно, но при проверке позже это будет иметь окончания CRLF. Для обычных текстовых файлов это обычно просто отлично. В данном случае это предупреждение «для вашей информации», но в случае, если git неправильно оценивает двоичный файл как текстовый файл, это важное предупреждение, потому что git тогда повредит ваш двоичный файл.
Если
core.autocrlf
установлено значение false, преобразование конца строки никогда не выполняется, поэтому текстовые файлы проверяются как есть. Обычно это работает нормально, если все ваши разработчики работают на Linux или на Windows. Но по моему опыту я все еще склонен получать текстовые файлы со смешанными окончаниями строк, которые в конечном итоге вызывают проблемы.Мое личное предпочтение - оставить настройку включенной, как разработчик Windows.
См. Http://kernel.org/pub/software/scm/git/docs/git-config.html для получения обновленной информации, включающей значение «input».
источник
core.eol
настройками, возможно, в сочетании с.gitattributes
конфигурацией. Я пытался выяснить различия и совпадения с помощью экспериментов, и это очень запутанно.Если вы уже проверили код, файлы уже проиндексированы. После изменения настроек git, скажем, запустив:
вы должны обновить индексы
и переписать git index с помощью
https://help.github.com/articles/dealing-with-line-endings/#refreshing-a-repository-after-changing-line-endings
Примечание. Это приведет к удалению локальных изменений. Прежде чем делать это, рассмотрите возможность их сохранения.
источник
git rm --cached -r .
? Почемуgit reset --hard
не достаточно?git rm --cached -r .
если вы сделаете этоgit reset --hard
после измененияcore.autocrlf
настройки, она не преобразует окончания строк. Вам нужно очистить индекс git.источник
autcrlf
дляfalse
всего плоскодонки вопроса для каждого пользователя вашего проекта.git config --global core.autocrlf false
вместо этого.Оба Unix2Dos и dos2unix доступны в окнах с gitbash. Вы можете использовать следующую команду для выполнения преобразования UNIX (LF) -> DOS (CRLF). Следовательно, вы не получите предупреждение.
или
Но не запускайте эту команду для любого существующего файла CRLF, тогда вы будете получать пустые символы новой строки каждую вторую строку.
dos2unix -D filename
не будет работать с каждой операционной системой. Пожалуйста, проверьте эту ссылку на совместимость.Если по какой-либо причине вам нужно форсировать команду, используйте
--force
. Если он говорит недействительным, используйте-f
.источник
dos2unix -D
преобразует окончания строк Windows в окончания строк Linux. Разве это не то же самое, что преобразование DOS (CRLF) -> UNIX (LF). Однакоdos2unix -h
говорится, что-D
будет выполнять преобразование UNIX (LF) -> DOS (CRLF). dos2unix Дополнительная информация: gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unixЯ думаю, что ответ @ Basiloungas близок, но устарел (по крайней мере, на Mac).
Откройте файл ~ / .gitconfig и установите
safecrlf
значение falseЭто * заставит его игнорировать конец строки, по-видимому (работал для меня, во всяком случае).
источник
safecrlf
(с 'f')Статья GitHub об окончаниях строк обычно упоминается при обсуждении этой темы.
Мой личный опыт использования часто рекомендуемых
core.autocrlf
настроек конфигурации был очень неоднозначным.Я использую Windows с Cygwin, работая с проектами Windows и UNIX в разное время. Даже мои проекты Windows иногда используют
bash
сценарии оболочки, которые требуют окончания строки UNIX (LF).Используя рекомендуемый GitHub
core.autocrlf
параметр для Windows, если я проверяю проект UNIX (который отлично работает на Cygwin - или, возможно, я участвую в проекте, который я использую на своем сервере Linux), текстовые файлы извлекаются с помощью Windows (CRLF). ) окончания строк, создающие проблемы.По сути, для такой смешанной среды, как у меня, настройка global
core.autocrlf
на любой из параметров не будет работать в некоторых случаях. Эта опция может быть установлена в локальном (репозитории) git config, но даже этого будет недостаточно для проекта, содержащего как Windows, так и UNIX-компоненты (например, у меня есть проект Windows с некоторымиbash
служебными скриптами).Лучший выбор, который я нашел, - это создание файлов .gitattributes для репозитория . Статья GitHub упоминает о нем.
Пример из этой статьи:
В одном из репозиториев моего проекта:
Это немного больше для настройки, но делайте это один раз для каждого проекта, и у любого участника в любой ОС не должно быть проблем с окончаниями строк при работе с этим проектом.
источник
text=false eol=false
работает несколько похоже наbinary
. Это звучит правильно? Может быть полезно указать: «Я знаю, что это текстовые файлы, но я не хочу, чтобы они нормализовались»В VIM откройте файл (например:)
:e YOURFILE
ENTER, затемисточник
vim
оставит все строки без изменений.У меня тоже была эта пробема.
SVN не выполняет преобразование конца строки, поэтому файлы фиксируются с неповрежденными окончаниями строки CRLF. Если затем вы используете git-svn для помещения проекта в git, то окончания CRLF сохраняются в репозитории git, а это не то состояние, в котором git ожидает себя найти - по умолчанию используется только конец строки unix / linux (LF) зарегистрировано
Когда вы затем извлекаете файлы в Windows, преобразование autocrlf оставляет файлы нетронутыми (поскольку они уже имеют правильные окончания для текущей платформы), однако процесс, который решает, есть ли разница с проверенными файлами, выполняет обратное преобразование. перед сравнением, в результате чего сравнивается то, что он считает LF в извлеченном файле с неожиданным CRLF в хранилище.
Насколько я вижу, ваш выбор:
Сноска: если вы выберете опцию №2, то, по моему опыту, некоторые из вспомогательных инструментов (ребаз, патч и т. Д.) Не справляются с файлами CRLF, и вы рано или поздно получите файлы с сочетанием CRLF и LF (несовместимая строка окончания). Я не знаю ни одного способа получить лучшее из обоих.
источник
rebase
не имеет проблем с CRLF. Единственная известная мне проблема заключается в том, что стандартный инструмент git merge будет вставлять свои маркеры конфликта ("<<<<<<", ">>>>>>" и т. Д.) Только с LF, поэтому файл с маркерами конфликта будет смешанные окончания строк. Однако, как только вы удалите маркеры, все в порядке.Удаление приведенного ниже из файла ~ / .gitattributes
* text=auto
не позволит git проверять окончания строк в первую очередь.
источник
false
, если этот файл не удален, установка значения autocrlf в false не сильно поможет, так что этот мне помог (но сам по себе этого недостаточно).text=
котором.gitattributes
вообще упоминается настройка (которая, если она присутствует, БУДЕТ блокировать). Таким образом, другие ответы являются неполными. Я сходил с ума, пытаясь понять, почему мои файлы продолжали отображаться как «модифицированные», независимо от того, сколько раз я менял свои настройкиautocrlf
иsafecrlf
настройки, проверял и очищал кэш git и полный сброс.Следует читать:
Эта картина должна объяснить, что это значит.
источник
http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/
Сделайте это в отдельном коммите, или git может по-прежнему видеть целые файлы измененными при внесении одного изменения (в зависимости от того, была ли изменена опция autocrlf)
Этот действительно работает. Git будет уважать окончания строк в смешанных проектах окончания строк и не будет предупреждать вас о них.
источник
*.sh -crlf
все время ...Я не знаю много о git на Windows, но ...
Мне кажется, что git конвертирует формат возврата, чтобы он соответствовал формату работающей платформы (Windows). CRLF является форматом возврата по умолчанию в Windows, в то время как LF является форматом возврата по умолчанию для большинства других ОС.
Скорее всего, формат возврата будет корректно настроен при переносе кода в другую систему. Я также считаю, что git достаточно умен, чтобы сохранить бинарные файлы в целости, а не пытаться конвертировать LF в CRLF, скажем, в JPEG.
Таким образом, вам, вероятно, не нужно слишком беспокоиться об этом преобразовании. Однако, если вы пойдете в архив своего проекта как tarball, коллеги-программисты, вероятно, оценят использование терминаторов строки LF, а не CRLF. В зависимости от того, насколько вы заботитесь (и в зависимости от того, не используете ли вы Блокнот), вы можете настроить git на использование LF-возвратов, если можете :)
Приложение: CR - это код 13 ASCII, LF - это код ASCII 10. Таким образом, CRLF - это два байта, а LF - один.
источник
Убедитесь, что вы установили последнюю версию git.
Я делал как выше
git config core.autocrlf false
, когда использовал git (версия 2.7.1), но он не работал.Тогда он работает сейчас при обновлении git (с 2.7.1 до 2.20.1).
источник
источник
git config --global core.autocrlf false
чтобы Git не устанавливал окончания строк вUnix
коммите. Продолжайте,git config core.autocrlf
чтобы проверить, действительно ли установлено значение false.Вопрос OP касается окон, и я не мог использовать другие, не заходя в каталог или даже запуская файл в Notepad ++, так как администратор не работал .. Поэтому пришлось пойти по этому пути:
источник
Многие текстовые редакторы позволяют вам перейти к
LF
, см. Инструкции Atom ниже. Просто и понятно.Нажмите
CRLF
внизу справа:Выберите
LF
в раскрывающемся списке сверху:источник
В командной строке GNU / Linux команды dos2unix и unix2dos позволяют легко конвертировать / форматировать файлы, поступающие из MS Windows.
источник
CRLF может вызвать некоторые проблемы при использовании вашего «кода» в двух разных ОС (Linux и Windows). Мой скрипт на python был написан в Docker-контейнере Linux, а затем отправлен с помощью Windows git-bash. Это дало мне предупреждение, что LF будет заменен на CRLF. Я не задумывался об этом, но потом, когда позже запустил сценарий, он сказал
/usr/bin/env: 'python\r': No such file or directory
. Теперь это\r
для разветвления для вас. Windows использует "CR" - возврат каретки - поверх '\ n' в качестве символа новой строки -\n\r
. Это то, что вы могли бы рассмотреть.источник
Большинство инструментов в Windows принимает только LF в текстовых файлах. Например, вы можете управлять поведением Visual Studio в файле с именем «.editorconfig» со следующим примером содержимого (часть):
Только оригинальный Windows-Блокнот не работает с LF, но есть несколько более подходящих простых инструментов редактора!
Следовательно, вы должны использовать LF в текстовых файлах и в Windows. Это мое сообщение, настоятельно рекомендуется! Нет причин использовать CRLF в Windows!
(То же самое обсуждение использует \ in include пути в C / ++, это фигня, используйте #include <pathTo / myheader.h> с косой чертой! Это стандарт C / ++, и все компиляторы Microsoft поддерживают его).
Следовательно, правильная настройка для git
Мое сообщение: Забудьте о таких старых мыслящих программах, как dos2unix и unix2dos. Уточните в вашей команде, что LF подходит для использования под Windows.
источник