--- ОБНОВЛЕНИЕ 3 --- (не конфликтует с ОБНОВЛЕНИЕМ 2)
Учитывая тот случай, когда пользователи Windows предпочитают работать, CRLF
а пользователи Linux / Mac предпочитают работать LF
с текстовыми файлами. Предоставление ответа с точки зрения сопровождающего хранилища :
Для меня лучшая стратегия (меньше проблем решить) является: сохранить все текстовые файлы с LF
внутренним мерзавцем репо , даже если вы работаете над проектом , окна-только. Затем предоставьте клиентам возможность работать со стилем окончания строки по своему усмотрению , при условии, что они выбирают core.autocrlf
значение свойства, которое будет соответствовать вашей стратегии (LF на репо) при подготовке файлов для фиксации.
Постановка - это то, что многие люди путают, пытаясь понять, как работают стратегии новой строки . Важно выбрать следующие моменты, прежде чем выбрать правильное значение для core.autocrlf
свойства:
- Добавление текстового файла для фиксации ( постановка ) аналогично копированию файла в другое место внутри
.git/
подкаталога с преобразованными окончаниями строк (в зависимости от core.autocrlf
значения в конфигурации клиента). Все это делается локально.
- Настройка
core.autocrlf
аналогична предоставлению ответа на вопрос (точно такой же вопрос на всех ОС):
- «Должен ли git-клиент a. Преобразовывать LF-в-CRLF при извлечении (извлечении) изменений из репозитория с удаленного компьютера или b. Преобразовывать CRLF-в-LF при добавлении файла для фиксации? » И возможные ответы (значения) находятся:
false:
"не делай ничего из вышеперечисленного ",
input:
" делай только б "
true
: " сделать а и б "
- обратите внимание, что нет " сделать только "
к счастью
- Настройки клиента git (windows:,
core.autocrlf: true
linux / mac:)
core.autocrlf: false
будут совместимы со стратегией LF-only-repo .
Значение : клиенты Windows по умолчанию преобразуются в CRLF при извлечении из хранилища и преобразуются в LF при добавлении для фиксации. И клиенты Linux по умолчанию не будут делать никаких преобразований. Это теоретически сохраняет ваш репо только для жизни.
К несчастью:
- Могут быть клиенты GUI, которые не уважают
core.autocrlf
значение git
- Могут быть люди, которые не используют значение для уважения вашей стратегии lf-repo. Например, они используют
core.autocrlf=false
и добавляют файл с CRLF для фиксации.
Чтобы обнаружить текстовые файлы не как lf, зафиксированные указанными выше клиентами, вы можете следовать инструкциям, приведенным в --- update 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEAD
на клиенте, скомпилированном с использованием: --with-libpcre
flag)
А вот и подвох . Я, как сопровождающий, храню git.autocrlf=input
репозиторий, чтобы я мог исправить любые ошибочно зафиксированные файлы, просто добавив их снова для фиксации. И я предоставляю текст коммита: «Исправление неверно зафиксированных файлов».
Насколько .gitattributes
это скрыто. Я не рассчитываю на это, потому что есть больше клиентов, которые не понимают этого. Я использую его только для предоставления подсказок для текстовых и двоичных файлов и, возможно, помечаю некоторые исключительные файлы, которые должны везде иметь одинаковые окончания строк:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
Вопрос: Но почему мы вообще заинтересованы в стратегии обработки новой строки?
Ответ. Чтобы избежать фиксации изменения одной буквы, отображается изменение в 5000 строк только потому, что клиент, выполнивший изменение, автоматически преобразовал полный файл из crlf в lf (или наоборот) перед добавлением его для фиксации. Это может быть довольно болезненным, когда вовлечено разрешение конфликта . Или это может быть в некоторых случаях причиной необоснованных конфликтов.
--- ОБНОВЛЕНИЕ 2 ---
По умолчанию клиент git будет работать в большинстве случаев. Даже если у вас есть только клиенты Windows, только клиенты Linux или оба. Эти:
- windows:
core.autocrlf=true
означает преобразование строк в CRLF при оформлении заказа и преобразование строк в LF при добавлении файлов.
- linux:
core.autocrlf=input
означает, что не нужно конвертировать строки при оформлении заказа (в этом нет необходимости, поскольку ожидается, что файлы будут зафиксированы с помощью LF), а конвертировать строки в LF (если необходимо) при добавлении файлов. ( - update3 - : кажется, что это false
по умолчанию, но опять же все в порядке)
Свойство может быть установлено в разных областях. Я бы предложил явно указать в области --global
действия, чтобы избежать некоторых проблем IDE, описанных в конце.
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
Также я бы настоятельно не рекомендовал использовать в Windows git config --global core.autocrlf false
(если у вас есть клиенты только для Windows), в отличие от того, что предлагается для git документации . Установка в false приведет к фиксации файлов с CRLF в репо. Но на самом деле нет причин. Вы никогда не знаете, нужно ли вам делиться проектом с пользователями Linux. Плюс это один дополнительный шаг для каждого клиента, который присоединяется к проекту, вместо использования значений по умолчанию.
Теперь для некоторых особых случаев файлов (например *.bat
*.sh
), которые вы хотите, чтобы они были извлечены с помощью LF или CRLF, вы можете использовать.gitattributes
Подводя итог для меня, лучшая практика :
- Убедитесь, что каждый недвоичный файл фиксируется с помощью LF в git repo (поведение по умолчанию).
- Используйте эту команду, чтобы убедиться, что никакие файлы не фиксируются с помощью CRLF:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Примечание: на клиентах Windows работает только через git-bash
клиентов Linux и только на клиентах Linux, если они скомпилированы с использованием --with-libpcre
in ./configure
).
- Если вы нашли такие файлы, выполнив приведенную выше команду, исправьте их. Это включает в себя (по крайней мере, в Linux):
- установить
core.autocrlf=input
( --- обновление 3 - )
- изменить файл
- отменить изменение (файл все еще отображается как измененный)
- совершить это
- Используйте только минимум
.gitattributes
- Попросите пользователей установить
core.autocrlf
описанные выше значения по умолчанию.
- Не рассчитывайте на 100% на наличие
.gitattributes
. git-клиенты IDE могут игнорировать их или обращаться с ними по-разному.
Как уже было сказано, некоторые вещи могут быть добавлены в атрибуты git:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
Я думаю, что некоторые другие безопасные варианты .gitattributes
вместо использования автоопределения для двоичных файлов:
-text
(например, для *.zip
или *.jpg
файлов: не будет рассматриваться как текст. Таким образом, преобразование в конце строки не будет предприниматься. Различия могут быть возможны через программы преобразования)
text !eol
(например , для *.java
, *.html
:.. Лечили как текст, но предпочтение EOL стиль не установлен Так настройка клиента используется)
-text -diff -merge
(например, для *.hugefile
: Не обрабатывается как текст. Дифф / слияние невозможно)
--- ПРЕДЫДУЩЕЕ ОБНОВЛЕНИЕ ---
Один болезненный пример клиента, который ошибочно фиксирует файлы:
NetBeans 8.2 (на окнах), будет неправильно совершать все текстовые файлы с CRLFs, если вы не в явном виде установить core.autocrlf
как глобальные . Это противоречит стандартному поведению клиента git и вызывает много проблем позже при обновлении / слиянии. Это то, что заставляет некоторые файлы выглядеть по-разному (хотя это не так), даже когда вы возвращаетесь .
Такое же поведение в NetBeans происходит, даже если вы правильно добавили .gitattributes
в свой проект.
Использование следующей команды после фиксации, по крайней мере, поможет вам определить, есть ли у вашего git-репо проблемы с окончанием строки: git grep -I --files-with-matches --perl-regexp '\r' HEAD
Я потратил часы, чтобы придумать наилучшее из возможных применений .gitattributes
, чтобы наконец понять, что я не могу на это рассчитывать.
К сожалению, пока существуют редакторы на основе JGit (которые не могут .gitattributes
правильно обрабатывать ), безопасное решение состоит в том, чтобы заставить LF везде, даже на уровне редактора.
Используйте следующие anti-CRLF
дезинфицирующие средства.
.gitattributes
?