Как преобразование окончания строки работает с git core.autocrlf между разными операционными системами

Я прочитал много разных вопросов и ответов о переполнении стека, а также документацию git о том, как core.autocrlf работает.

Это мое понимание из того, что я прочитал:

Клиенты Unix и Mac OSX (до OSX используют CR) используют окончания строк LF.
Клиенты Windows используют окончания строк CRLF.

Когда для core.autocrlf на клиенте задано значение true, в репозитории git файлы всегда хранятся в формате окончания строки LF, а окончания строк в файлах на клиенте преобразуются туда и обратно при извлечении / фиксации для клиентов (например, Windows). которые используют окончания строк, отличные от LF, независимо от того, в каком формате файлы окончаний строк находятся на клиенте (это не согласуется с определением Тима Клема - см. обновление ниже).

Вот матрица, которая пытается задокументировать то же самое для настроек «input» и «false» в core.autocrlf с вопросительными знаками, когда я не уверен в поведении преобразования конца строки.

Мои вопросы:

  1. Какими должны быть вопросительные знаки?
  2. Верна ли эта матрица для «не вопросительных знаков»?

Я обновлю вопросительные знаки из ответов, поскольку консенсус кажется быть сформированным.

                       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, получившим наибольшее количество голосов на сегодняшний день, показывает полное согласие по истинным и входным настройкам и несогласие с ложными настройками.

207
задан alpha_989 25 May 2018 в 12:06
поделиться

1 ответ

Ситуация на фронте "преобразования 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: refactor crlf_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".

38
ответ дан 23 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: