--- ОБНОВЛЕНИЕ 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: truelinux / 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-libpcreflag)
А вот и подвох . Я, как сопровождающий, храню 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-libpcrein ./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?