Як змусити git використовувати LF замість CR + LF під Windows?


335

Я хочу змусити 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

2
autocrlf=inputє правильним варіантом. Звичайно, це не захистить вас від файлів, які справді є cr+lfу сховищі, або створення файлів cr+lfв іншому інструменті перед додаванням їх у git. Які у вас проблеми, що це не працює?
CB Bailey

2
Файли у сховищі вже використовуються лише, LFале коли я отримую їх під Windows, msysgit перетворює їх у CR+LF.
sorin

У вашому конфігурації має бути щось; Я щойно перевірив це на моїй установці msysgit. Якщо autocrlfвстановлено значення input, git залишає lfстрічкові канали в спокої. Чи можете ви розмістити вихід git config?
CB Bailey

1
У такому випадку я пропоную вам зареєструвати помилку; бажано вказувати на тестовий сховище, яке демонструє вашу проблему, включаючи кроки для відтворення, оскільки поведінка, яку ви бачите, напевно неправильна (але я не можу її відтворити).
CB Bailey

1
Невелика порада - це також переконатися, що ви виконуєте команди git на "git", який ви думаєте. Наприклад, у вас може бути встановлений git на windows, а git встановлений на cygwin, тому переконайтеся, що ви встановили правильну конфігурацію git.
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?

Оскільки Git 2.16 (I квартал 2018 року), ви можете скористатись git add --renormalize .цими .gitattributesналаштуваннями негайно.


Але другий більш потужний крок передбачає: драйвер фільтру gitattribute і додає крок розмиття

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

Щоразу, коли ви оновлюватимете своє робоче дерево, сценарій може, лише для файлів, вказаних у програмі .gitattributes, примусити LF eolта будь-який інший варіант форматування, який ви хочете застосувати.
Якщо clearсценарій нічого не робить, ви (після фіксації) перетворите свої файли, застосувавши саме той формат, який вам потрібен.


Одне запитання: * .txt стосується всіх файлів з розширенням .txt або всіх текстових файлів (не двійкових)? Я не можу скласти список із усіма видами розширень файлів, які матиму в проекті.
sorin

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

1
На даний момент .gitattributesрядки повинні читати: *.txt text eol=lfвідповідно до git-scm.com/docs/gitattributes
онук

@grandchild Дякую Я включив ваш коментар у відповідь для більшої наочності.
VonC

Я думаю, після того, як ми додамо, що .gitattributesнам потрібно зробитиgit add --renormalize .
shuva

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?
Хронічний

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) без запиту ( -f), всі файли, крім тих, які ви редагували ( --cached), з поточного каталогу ( .). TheresetПовертає всі ці файли в стан , де вони мають свої справжні кінцівки лінії (відповідності , що в репо).

Якщо вам потрібно виправити закінчення рядків файлів у репо, я рекомендую захопити редактор, який дозволить вам робити це масово, як IntelliJ або Sublime Text, але я впевнений, що будь-який хороший, швидше за все, це підтримає.


1
У нас є одне репо з підкаталогами, які потребують різного керування закінченням рядків. Тож встановлення глобального варіанту для цього не працює. Навіть не в єдиному репо. Як ви застосовуєте ці самі налаштування в .gitattributes?
RobG

Notepad++також в нижньому правому куті показано закінчення рядка відкритого файлу currenlty. Клацання правою кнопкою миші на цьому полі дозволить змінити закінчення рядка.
winklerrr

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

1
Дякую, за вашу допомогу я підкорив lint та Linux. Тепер можна перевірити файли.
GC_

57

Контекст

Якщо ви

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

ви можете зробити це, починаючи з git 2.10. 2.10 або новішої версії потрібно, оскільки 2.10 фіксує поведінку тексту = 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 я виписував би LOL EOL .
Jazzepi

Це, безумовно, найкраще рішення. Не потрібно вручну запускати будь-які команди конфігурації!
Камерон Таклінд

26

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

Якщо core.autocrlfвстановлено значення input, 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 ви просто передаєте правду конфігурації. Наприклад: C:> git config --global core.autocrlf true

Удачі, сподіваюся, я допомогла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.