Как заставить git использовать LF вместо CR + LF под окнами?

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

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

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

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

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

Ответ 1

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

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

Первый простой шаг все равно будет находиться в файле .gitattributes:

*.txt -crlf

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

См. Рекомендации по конфигурации кросс-платформенной конфигурации git


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

filter driver

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

Ответ 2

Правильный способ получить 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 нормализовать все файлы в репо. Для этого перейдите в корень вашего репо и выполните следующие команды:

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 .

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

Если вы (i) хотите, чтобы все пользователи имели окончание строк LF для текстовых файлов, и (ii) вы не можете гарантировать, что все пользователи изменят свою конфигурацию git, вы можете сделать это, начиная с git 2.10. 2.10 или новее, потому что 2.10 исправил поведение text = auto вместе с eol = lf. Источник.

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

* text=auto eol=lf

Добавить и зафиксировать его.