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

Я хочу заставить 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 ответов


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

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

первый простой шаг все равно будет в :

*.txt -crlf

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

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


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

filter driver

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


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

git config --global core.autocrlf false

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

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

* text=auto

и set core.eol to 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 .

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

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

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

С существующее РЕПО, которое вы уже проверили – которое имеет правильные окончания строк в РЕПО, но не вашу рабочую копию – вы можете запустить следующие команды, чтобы исправить это:

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

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

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


контекст

если вы

  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

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

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