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


335

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

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

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

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

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

2
autocrlf=inputэто правильный вариант. Конечно, это не защитит вас от файлов, которые действительно есть cr+lfв хранилище, или от создания файлов cr+lfв другом инструменте перед добавлением их в git. Какие у вас проблемы, что это не работает?
CB Bailey

2
Файлы в хранилище уже используются только, LFно когда я получаю их под Windows, msysgit преобразует их в CR+LF.
Сорин

Там должно быть что-то не так с вашей конфигурации; Я только что проверил это на моей установке msysgit. При autocrlfустановленном inputзначении git оставляет lfпереводы строк в покое. Можете ли вы опубликовать вывод git config?
CB Bailey

1
В этом случае я предлагаю вам зарегистрировать ошибку; желательно указывать на тестовое хранилище, в котором показана ваша проблема, и в том числе указывать шаги для воспроизведения, поскольку поведение, которое вы видите, определенно неверно (но я не могу воспроизвести его).
CB Bailey

1
Небольшой совет - также убедитесь, что вы выполняете команды git на «git», которым вы себя считаете. Например, у вас может быть установлен git на windows, а git установлен на cygwin, поэтому убедитесь, что вы установили правильный git config.
lfred

Ответы:


106

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

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

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

# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

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

И я всегда рекомендовал git config --global core.autocrlf false отключить любое преобразование (которое будет применяться ко всем версионным файлам)

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

Начиная с Git 2.16 (Q1 2018), вы можете сразу же git add --renormalize .применить эти .gitattributesнастройки.


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

драйвер фильтра

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


Один вопрос: * .txt относится ко всем файлам с расширением .txt или ко всем текстовым файлам (не двоичным)? Я не могу составить список со всеми видами расширений файлов, которые будут у меня в проекте.
Сорин

1
@ Сорин: все файлы с .txtрасширением. Желательно сначала установить это и протестировать в определенной группе, а затем обобщить до * и добавить отрицательное правило, !*.xyz ...чтобы исключить несколько файлов из этого правила.
VonC

1
К настоящему времени .gitattributesстроки должны выглядеть следующим образом : *.txt text eol=lfсогласно git-scm.com/docs/gitattributes
внук

@ grandchild Спасибо. Я включил ваш комментарий в ответ для большей наглядности.
VonC

Я думаю, после того, как мы добавим, .gitattributesмы должны сделатьgit add --renormalize .
Шува

461

Правильный способ получить 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
Я получаю фатальную pathspec '' не найдено ни одного файла, сразу послеgit diff --cached --name-only -z | xargs -0 git add
CMCDragonkai

3
какой выход git diff --cached --name-only?
Chronial

1
Возможно, стоит упомянуть, что вы можете установить этот конфиг во время клонирования репо, например git clone --config core.autocrlf=false <repo path>.
Крис Лонг

240

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

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

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

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

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

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

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

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


1
У нас есть один репозиторий с подкаталогами, которые требуют другой обработки окончания строки. Таким образом, установка глобальной опции не работает для этого. Даже в одном репо. Как вы применяете эти же настройки в .gitattributes?
RobG

Notepad++также показывает окончание строки текущего открытого файла в правом нижнем углу. Щелчок правой кнопкой мыши по этому полю позволит вам изменить окончания строк.
winklerrr

1
core.autocrlf inputОпция отменяет core.eolнастройку, поэтому установка и является излишним. (См. Git-scm.com/docs/git-config )
Эндрю Маршалл

1
Спасибо, с вашей помощью я покорил линт и линукс. И теперь можно проверить в файлах.
GC_

57

контекст

если ты

  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

3
Это было лучшее решение для меня. Я также объединил это с editorconfig.org, чтобы при написании в Intellij я выписывал LF EOL.
Jazzepi

Это, безусловно, лучшее решение. Не нужно вручную запускать какие-либо команды настройки!
Кэмерон Таклинд

26

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

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


19
Команды должны быть git rm --cached -r. && git reset --hard
koppor

0

Вы можете найти решение этой проблемы по адресу: https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings

Упрощенное описание того, как вы можете решить эту проблему в Windows:

Глобальные настройки для концов строк Команда git config core.autocrlf используется для изменения способа обработки концов строк в Git. Требуется один аргумент.

В Windows вы просто передаете true в конфигурацию. Например: C:> git config --global core.autocrlf true

Удачи, надеюсь, я помог.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.