Как заставить git использовать LF вместо CR + LF под Windows? - PullRequest
275 голосов
/ 25 марта 2010

Я хочу заставить git извлекать файлы под Windows, используя LF, а не CR+LF. Я проверил два варианта конфигурации, но не смог найти правильную комбинацию настроек.

Я хочу, чтобы он преобразовал все файлы в LF и сохранил LF для файлов.

Примечание: я использовал autocrlf = input, но это просто восстанавливает файлы, когда вы их фиксируете. Я хочу заставить его использовать LF.

Вероятно, я не был так ясен: репозиторий уже использует LF, но файлы, извлеченные с помощью msysgit, используют CR+LF, и я хочу заставить msysgit получить их с помощью LF: , заставляя Unix окончания строки .

>git config --list | grep crlf
core.autocrlf=input

Ответы [ 5 ]

376 голосов
/ 31 октября 2012

Правильный способ получить LF-окончания в Windows - сначала установить core.autocrlf на false:

git config --global core.autocrlf false

Это необходимо сделать, если вы используете msysgit, потому что он устанавливает true в системных настройках.

Теперь git не будет выполнять нормализацию строк. Если вы хотите, чтобы файлы, которые вы регистрируете, были нормализованы, сделайте это: Установите text=auto в вашем .gitattributes для всех файлов:

* text=auto

И установить core.eol на lf:

git config --global core.eol lf

Теперь вы также можете переключить отдельные репозитории на crlf (в рабочем каталоге!), Запустив

git config core.eol crlf

После того, как вы выполните настройку, вы можете захотеть, чтобы git нормализовал все файлы в repo . Для этого перейдите в корень вашего репозитория и выполните следующие команды:

git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f

Если вы хотите, чтобы git также нормализовал файлы в вашем рабочем каталоге , выполните следующие команды:

git ls-files -z | xargs -0 rm
git checkout .
185 голосов
/ 30 октября 2015

Я довольно часто возвращаюсь к этому ответу, хотя ни один из них мне не подходит. Тем не менее, правильный ответ для меня - это смесь других.

То, что я нахожу работы, выглядит следующим образом:

 git config --global core.eol lf
 git config --global core.autocrlf input

Для репозиториев, которые были извлечены после того, как были установлены эти глобальные настройки, все будет извлечено так же, как и в репозитории & ndash; надеюсь LF (\n). Любой CRLF будет преобразован в LF при регистрации.

С существующим репо, которое вы уже проверили & ndash; у него правильные окончания строк в репо, но нет вашей рабочей копии & ndash; Вы можете запустить следующие команды, чтобы исправить это:

git rm -rf --cached .
git reset --hard HEAD

Это приведет к рекурсивному удалению (rm) (r) без запроса (-f) всех файлов, кроме отредактированных (--cached), из текущего каталога (.). reset затем возвращает все эти файлы в состояние, в котором у них есть истинные окончания строк (в соответствии с тем, что в репо).

Если вам нужно исправить окончание строк файлов в репо, я рекомендую взять редактор, который позволит вам сделать это оптом, например IntelliJ или Sublime Text, но я уверен, что любой хороший, вероятно, поддержит это.

80 голосов
/ 25 марта 2010

ОП добавил в своем вопросе:

файлы, извлеченные с помощью msysgit, используют CR+LF, и я хочу подделать msysgit, чтобы получить их с LF

Первый простой шаг по-прежнему будет в файле .gitattributes:

*.txt -crlf

, чтобы избежать любого преобразования crlf для файлов с правильным eol.

См. Лучшие практики для кросс-платформенного git config?


Но второй, более мощный шаг включает драйвер фильтра gitattribute и добавление шага

filter driver

Когда бы вы ни обновляли рабочее дерево, сценарий мог, только для файлов, указанных в .gitattributes, принудительно устанавливать LF eol и любой другой параметр форматирования, который вы хотите применить.
Если скрипт "clear" ничего не делает, вы будете (после фиксации) преобразовывать свои файлы, применяя в точности тот формат, который вам нужен.

35 голосов
/ 09 февраля 2017

Контекст

Если вы

  1. хочет заставить всех пользователей иметь LF-окончания для текстовых файлов и
  2. вы не можете гарантировать, что все пользователи изменят свои настройки git,

вы можете сделать это, начиная с git 2.10. Требуется 2.10 или более поздняя версия, поскольку 2.10 исправлено поведение text = auto вместе с eol = lf . Источник .

Решение

Поместите файл .gitattributes в корень вашего репозитория git со следующим содержимым:

* text=auto eol=lf

Передайте это.

Дополнительные настройки

Вы также можете добавить .editorconfig в корень хранилища, чтобы современные инструменты создавали новые файлы с нужными окончаниями строк.

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
25 голосов
/ 01 апреля 2010

core.autocrlf=input - это правильная настройка для того, что вы хотите, но вам может потребоваться ввести git update-index --refresh и / или git reset --hard, чтобы изменения вступили в силу.

Если для core.autocrlf установлено значение input, git не будет применять преобразование новой строки при выписке (поэтому, если у вас есть LF в репо, вы получите LF), но он обязательно сделает это, если вы испортить и ввести некоторые CRLF в рабочую копию, они не попадут в репозиторий.

...