Я прочитал много разных вопросов и ответов о переполнении стека, а также документацию git о том, как core.autocrlf работает.
Это мое понимание из того, что я прочитал:
Клиенты Unix и Mac OSX (до OSX используют CR) используют окончания строк LF.
Клиенты Windows используют окончания строк CRLF.
Когда для core.autocrlf на клиенте задано значение true, в репозитории git файлы всегда хранятся в формате окончания строки LF, а окончания строк в файлах на клиенте преобразуются туда и обратно при извлечении / фиксации для клиентов (например, Windows). которые используют окончания строк, отличные от LF, независимо от того, в каком формате файлы окончаний строк находятся на клиенте (это не согласуется с определением Тима Клема - см. обновление ниже).
Вот матрица, которая пытается задокументировать то же самое для настроек «input» и «false» в core.autocrlf с вопросительными знаками, когда я не уверен в поведении преобразования конца строки.
Мои вопросы:
Я обновлю вопросительные знаки из ответов, поскольку консенсус кажется быть сформированным.
core.autocrlf value true input false ---------------------------------------------------------- commit | convert ? ? new | to LF (convert to LF?) (no conversion?) commit | convert to ? no existing | LF (convert to LF?) conversion checkout | convert to ? no existing | CRLF (no conversion?) conversion
Я не особо интересуюсь мнениями о плюсах и минусах различных настроек.Я просто ищу данные, которые проясняют, как ожидать, что git будет работать с каждой из трех настроек.
-
Обновление от 17.04.2012 : После прочтения статьи Тима Клема , на которую указывает JJD в комментариях, я изменил некоторые значения в «неизвестно» значения в таблице выше, а также изменение «checkout existing | true для преобразования в CRLF вместо преобразования в клиент». Вот его определения, которые более ясны, чем все, что я видел где-либо еще:
core.autocrlf = false
Это значение по умолчанию, но большинству людей рекомендуется немедленно изменить это . В результате использования false Git никогда не нарушает окончания строк в вашем файле. Вы можете возвращать файлы с помощью LF или CRLF или CR или произвольного сочетания этих трех, и Git это не волнует. Это может затруднить чтение различий и затруднить слияние. Большинство людей , работающих в мире Unix / Linux, используют это значение, потому что у них нет проблем с CRLF, и им не нужно, чтобы Git выполнял дополнительную работу всякий раз, когда файлы записывается в объектную базу данных или записывается в рабочий каталог .
core.autocrlf = true
Это означает, что Git обработает все текстовые файлы и обеспечит замену CRLF на LF при записи этого файла в базу данных объектов и включит все LF обратно в CRLF при записи в рабочий каталог . Это рекомендуемый параметр в Windows, поскольку он гарантирует, что ваш репозиторий может использоваться на других платформах, сохраняя CRLF в вашем рабочем каталоге.
ядро.autocrlf = input
Это означает, что Git обработает все текстовые файлы и обеспечит замену CRLF на LF при записи этого файла в базу данных объекта . Однако обратного не произойдет. Когда вы считываете файлы обратно из объектной базы данных и записываете их в рабочий каталог , они все еще будут иметь LF для обозначения конца строки. Этот параметр обычно используется в Unix / Linux / OS X для предотвращения записи CRLF в репозиторий. Идея состоит в том, что если вы вставили код из веб-браузера и случайно получили CRLF в один из ваших файлов , Git позаботится о том, чтобы они были заменены на LF, когда вы написали в база данных объектов.
Статья Тима превосходна, единственное, о чем я думаю, чего не хватает, так это того, что он предполагает, что репозиторий находится в формате LF, что не всегда верно, особенно для проектов только для Windows.
Сравнение статьи Тима с ответом jmlane, получившим наибольшее количество голосов на сегодняшний день, показывает полное согласие по истинным и входным настройкам и несогласие с ложными настройками.
Ситуация на фронте "преобразования eol" скоро изменится с выходом Git 1.7.2:
Добавляется/развивается новая настройка конфигурации core.eol
:
Это замена коммита 'Add "
core.eol
" config variable', который сейчас находится вpu
(последний в моей серии).
Вместо того, чтобы подразумевать, что "core.autocrlf=true
" является заменой для "* text=auto
", он делает явным тот факт, чтоautocrlf
предназначен только для пользователей, которые хотят работать с CRLF в их рабочем каталоге на хранилище, в котором нет нормализации текстовых нормализация файлов.
Когда он включен, "core.eol" игнорируется.Введена новая конфигурационная переменная "
core.eol
", которая позволяет пользователю установить, какие окончания строк использовать для нормализованных в конце строки файлов в рабочем каталоге.
По умолчанию используется "native
", что означает CRLF в Windows и LF везде. Обратите внимание, что "core.autocrlf
" переопределяетcore.eol
.
Это означает, что:[core] autocrlf = true
помещает CRLF в рабочий каталог, даже если
core.eol
установлен на "lf
".core.eol:
Устанавливает тип окончания строки, используемый в рабочем каталоге для файлов, у которых установлено свойство
text
.
Альтернативами являются 'lf', 'crlf' и 'native', который использует родное окончание строки платформы.
Значение по умолчанию -native
.
Другие изменения рассматриваются:
Для 1.8 я бы рассмотрел возможность сделать
core.autocrlf
просто включающим нормализацию и оставить решение об окончании строки рабочего каталога core.eol, но это сломает настройки людей.
git 2.8 (март 2016) улучшает способ core. autocrlf
влияет на eol:
См. commit 817a0c7 (23 февраля 2016), commit 6e336a5, commit df747b8, commit df747b8 (10 февраля 2016), commit df747b8, commit df747b8 (10 февраля 2016), и commit 4b4024f, commit bb211b4, commit 92cce13, commit 320d39c, commit 4b4024f, commit bb211b4, commit 92cce13, commit 320d39c (05 февраля 2016) by Torsten Bögershausen (tboegi
).
(Merged by Junio C Hamano -- gitster
-- in commit c6b94eb, 26 Feb 2016)
convert.c
: refactorcrlf_action
Рефакторинг определения и использования
crlf_action
.
Сегодня, когда в файле не установлен атрибут "crlf
",crlf_action
устанавливается на.CRLF_GUESS
. Вместо этого используйтеCRLF_UNDEFINED
, а поиск по "text
" или "eol
" выполняйте как и раньше.Заменить старое
CRLF_GUESS
использование:
CRLF_GUESS && core.autocrlf=true -> CRLF_AUTO_CRLF
CRLF_GUESS && core.autocrlf=false -> CRLF_BINARY
CRLF_GUESS && core.autocrlf=input -> CRLF_AUTO_INPUT
Сделать более ясным, что есть что, определив:
- CRLF_UNDEFINED : No attributes set. Temparally used, until core.autocrlf
and core.eol is evaluated and one of CRLF_BINARY,
CRLF_AUTO_INPUT or CRLF_AUTO_CRLF is selected
- CRLF_BINARY : No processing of line endings.
- CRLF_TEXT : attribute "text" is set, line endings are processed.
- CRLF_TEXT_INPUT: attribute "input" or "eol=lf" is set. This implies text.
- CRLF_TEXT_CRLF : attribute "eol=crlf" is set. This implies text.
- CRLF_AUTO : attribute "auto" is set.
- CRLF_AUTO_INPUT: core.autocrlf=input (no attributes)
- CRLF_AUTO_CRLF : core.autocrlf=true (no attributes)
Как torek добавляет в комментариях:
все эти переводы (любое преобразование EOL из настроек
eol=
илиautocrlf
, и фильтры "clean
") выполняются, когда файлы перемещаются из рабочего дерева в индекс, т.е. e., во времяgit add
, а не во времяgit commit
.
(Обратите внимание, чтоgit commit -a
или--...only
или--include
все же добавляют файлы в индекс в это время).
Подробнее об этом см. в статье "В чем разница между autocrlf и eol".