Windows git "попередження: LF буде замінено CRLF", це попередження хвостиком назад?


147

env:

  • Windows 7
  • msysgit

Коли я git commit, це говорить:

warning: LF will be replaced by CRLF. 

Це попереджуючий хвіст назад?
Я редагую файл у Windows, кінець рядка є CRLF, як і на цьому малюнку:
введіть тут опис зображення
І git змінює його на LFдля здійснення репо.
Тому я думаю, що правильне попередження:

warning: CRLF will be replaced by LF. 


2
@devnull Я маю на увазі попередження назад хвостом, чи не так?
Honghe.Wu

@ Honghe.Wu Ні, це не в Windows. Я відредагував свою відповідь нижче
VonC

11
Велике запитання, адже справді попередження здається зворотним. Це дійсно заплутано отримувати це попередження про перетворення на CRLF на коміті, і жодна кількість пояснень поводженням Git з пробілом не допоможе, оскільки попередження є зворотним .
Штійн де Вітт

1
@StijndeWitt Я хотів би бачити, як ти коментуєш відповідь на підтримку.
користувач1460043

Відповіді:


185

попередження: LF буде замінено CRLF.

Залежно від редактора, який ви використовуєте, текстовий файл з LF не потрібно буде зберігати за допомогою CRLF: останні редактори можуть зберігати стиль eol. Але ця настройка git config наполягає на зміні цих ...

Просто переконайтесь, що (як я рекомендую тут ):

git config --global core.autocrlf false

Таким чином, ви уникаєте будь-якого автоматичного перетворення і можете все-таки вказати їх через .gitattributesфайл та core.eolдирективи .


windows git "LF буде замінено CRLF"
Це попереджуючий хвіст назад?

Ні: ви в Windows, і на git configдовідковій сторінці згадується

Використовуйте це налаштування, якщо ви хочете мати CRLFу своєму робочому каталозі закінчення рядків, навіть якщо сховище не має нормалізованих закінчень рядків.

Як описано у " заміні git заміною LF на CRLF ", це має відбуватися лише під час оформлення замовлення (не фіксація), на core.autocrlf=true.

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

Як уже згадувалося в Сяопіна «s відповідь , що попередження є такий же , як:

попередження: (Якщо ви перевірите це / або клонуєте до іншої папки з вашою поточною core.autocrlfконфігурацією,) LF буде замінено CRLF
Файл матиме свої оригінальні закінчення рядка у вашому (поточному) робочому каталозі.

Як згадується у git-for-windows/gitвипуску 1242 :

Я все ще вважаю, що це повідомлення є заплутаним, повідомлення може бути розширене, щоб включити краще пояснення проблеми, наприклад: "LF буде замінено CRLF file.jsonпісля видалення файлу та повторної перевірки".

Примітка: Git 2.19 (вересень 2018 року), коли використовується core.autocrlf, фіктивне попередження "LF буде замінено CRLF" тепер придушується .


Як quaylar справедливо зауваження , якщо є перетворення на фіксацію, вона є LFтільки.

Це конкретне попередження " LF will be replaced by CRLF" надходить від convert.c # check_safe_crlf () :

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

Він називається convert.c#crlf_to_git(), сам покликаний convert.c#convert_to_git(), сам покликаний convert.c#renormalize_buffer().

І це останнє renormalize_buffer()лише називається merge-recursive.c#blob_unchanged().

Тому я підозрюю, що ця конверсія відбувається git commitлише в тому випадку, якщо згадана фіксація є частиною процесу злиття.


Примітка: з Git 2.17 (Q2 2018) очищення коду додає певне пояснення.

Див. Комітет 8462ff4 (13 січня 2018 р.) Торстена Бьогерсгаузена ( tboegi) .
(Об’єднано Хуніо С Хамано - gitster- у комітеті 9bc89b1 , 13 лютого 2018 р.)

convert_to_git (): safe_crlf / checksafe стає int conv_flags

Коли Ви телефонуєте convert_to_git(), то checksafeпараметр визначається , що має статися , якщо перетворення EOL ( CRLF --> LF --> CRLF) НЕ в обидві сторони чисто.
Крім того, він також визначив, чи слід закінчення рядків перенормувати ( CRLF --> LF) чи зберегти такими, якими вони є.

checksafe був safe_crlfперерахунком із цими значеннями:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Зауважте, що регресія, запроваджена в 8462ff4 (" convert_to_git(): safe_crlf/checksafeстає int conv_flags", 2018-01-13, Git 2.17.0) ще в циклі Git 2.17, змусила autocrlfпереписувачів видавати попереджувальне повідомлення, незважаючи на налаштуванняsafecrlf=false .

Див. Комісію 6cb0912 (04 червня 2018 р.) Від Anthony Sottile ( asottile) .
(Об'єднано Хуніо С Хамано - gitster- у комітеті 8063ff9 , 28 червня 2018 р.)


1
Так, більшість редакторів може зберегти стиль EOL, але для більшості редакторів це не впливає при створенні нового файлу в тому ж проекті. Переконайтеся, що ви не перевіряєте LF-проект, подумайте "psh, мій редактор може обробляти закінчення рядків LF, мені не потрібен autocrlf", а потім забудьте вручну встановити нові файли на закінчення рядка LF.

15
@VonC Я мушу зізнатися, я не отримую цього. У Git-Book зазначено, що Git може впоратися з цим шляхом автоматичного перетворення закінчень рядків CRLF в LF під час здійснення, і навпаки, коли він перевіряє код на вашу файлову систему. Це означає, що при фіксації буде перехід на LF і ніколи в CRLF . Що означає, що вказане попередження є невірним. Маючи core.autocrlf=trueбуде завжди давати в ЛФ в репо, і CRLF в робочому дереві IMHO (навіть в не-Windows). Джерело: посилання
quaylar

12
"Це попереджувальний хвіст назад? Це має відбуватися лише при оформленні замовлення" Я бачу це точне попередження про вчинення . Так так , це відстало. Це відставання спонукало мене до пошуку. Радий, що й інші помітили це! Це дуже заплутано для людей, які насправді читають ці попередження, бачачи, що вони перетворяться на CRLF у повідомленні про вчинення.
Штійн де Вітт

7
"Тож я підозрюю, що це перетворення відбувається на git-зобов'язанні лише у тому випадку, якщо згадана фіксація є частиною процесу злиття." Ні. Я бачу це регулярно.
Штійн де Вітт

3
Частина, яка мене клопоче про повідомлення, - це те, що воно взагалі спливає. чому мені потрібно бути поперединим, що git збирається робити саме те, що я його налаштував. Мені не потрібне попередження: "Ей, ми все ще перетворюємо закінчення рядків для вас, як ви просили нас". Коли система веде себе дизайном, вона не повинна давати зайвих попереджень, або люди пропускають важливі попередження у морі невідповідних повідомлень.
Брент Ларсен

27

ТАК попередження назад.

І насправді це навіть не повинно бути попередженням. Оскільки все це попередження говорить (але, на жаль, назад), це те, що символи CRLF у вашому файлі із закінченнями рядків Windows будуть замінені на LF на фіксації. Це означає, що він нормалізується на ті ж самі закінчення рядків, які використовуються * nix та MacOS.

Нічого дивного не відбувається, саме такої поведінки ви хотіли б хотіти.

Це попередження в його теперішній формі - це одна з двох речей:

  1. Невдала помилка в поєднанні з надмірно обережним попередженням або
  2. Дуже розумний сюжет , щоб ви дійсно думаєте , це через ...

;)


1
Що дивно, що якщо ви примусово конвертуєте локальні файли в Windows в LF, ви навіть не можете додавати файли, повідомлення скаржиться на це і скасовує вашу комісію.
phpguru

24

- Оновити 9 липня ---

Видалено "Це правильно і точно", як коментує @mgiuca

======

НІ . В даний час НЕ говорять про ваші файли CRLF. Натомість це розмова про файли з LF.

Він повинен читати:

попередження: ( Якщо ви перевірите це / або клонуєте до іншої папки з поточною конфігурацією core.autocrlf ,) LF буде замінено на CRLF

Файл матиме оригінальні закінчення рядка у вашому ( поточному ) робочому каталозі.

Ця картина повинна пояснити, що це означає. введіть тут опис зображення


1
Приємна ілюстрація. +1. Я посилався на вашу відповідь у моїй для більшої наочності.
VonC

Що для мене добре працює: 1) core.autocrlf = false 2) в Intellij встановити розділовий рядок (\ n). Я використовую Intellij Idea і для Mac, і для Windows.
Сяо Пен - ZenUML.com

Це може статися, коли файл був створений у Windows, але має закінчення рядка unix / mac (lf), і ваше властивість git config autocrlf є правдивим. По суті, git не збирається змінювати створений вами файл, але він перевірить його / закриє його закінченнями вікон (через налаштування autocrlf)
Патрік

1
Яке попередження правильне та точне, якщо вам доведеться кваліфікувати його за допомогою "Якщо ви перевірите це / або клонуєте до іншої папки з поточною конфігурацією core.autocrlf". Про це не йдеться в оригінальному повідомленні. В ньому йдеться про те, що БУДЕ (не може) замінити CRLF, маючи на увазі, що він буде зберігатися в режимі CRLF в самій репо, а не в якійсь гіпотетичній майбутній касі.
mgiuca

12

Все це передбачає core.autocrlf=true

Оригінальна помилка:

попередження: LF буде замінено CRLF
Файл матиме свої оригінальні закінчення рядків у вашій робочій директорії.

Яку помилку ОБОВ'ЯЗКОВО читати:

попередження: LF буде замінено CRLF у вашому робочому каталозі
. Файл матиме свої оригінальні закінчення рядка LF у сховищі git

Пояснення тут :

Побічним ефектом цього зручного перетворення, і це те, про що ви бачите попередження, полягає в тому, що якщо текстовий файл, який ви автором, спочатку мав закінчення LF замість CRLF, він буде зберігатися з LF, як зазвичай, але коли буде встановлено прапорець пізніше він матиме закінчення CRLF. Для звичайних текстових файлів це, як правило, добре. Попередження в цьому випадку є "для вашої інформації", але у випадку, якщо git неправильно оцінює двійковий файл як текстовий файл, це важливе попередження, оскільки git потім пошкодить ваш двійковий файл.

В основному, локальний файл, який раніше був LF, тепер матиме CRLF локально


7

git config --global core.autocrlf false добре працює для глобальних налаштувань.

Але якщо ви використовуєте Visual Studio, можливо, також знадобиться змінити .gitattributesдля деяких типів проектів ( наприклад, додаток бібліотеки c # class ):

  • видалити рядок * text=auto

1

Після того, як я встановив, core.autocrlf=trueя отримував "LF буде замінений на CRLF" (зауважте, що "CRLF буде замінений LF"), коли я git adding (або, можливо, це було на git commit?) Редагував файли у Windows на сховищі (для чого це використовується LF), що перевірявся перед тим , як я встановивcore.autocrlf=true .

Я зробив новий замовлення з, core.autocrlf=trueі тепер я не отримую цих повідомлень.


0

Якщо ви використовуєте Visual Studio 2017, 2019, ви можете:

  1. відкрити головну .gitignore (оновити або видалити чергові .gitignore файли в інших проектах у рішенні)
  2. вставте наведений нижче код:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process

1
Те , що «код» виглядає як це повинно бути в файлі конфігурації , як .gitconfigабо .git/config, що не .gitignore, який визначає файли , які будуть ігноруватися мерзотника.
davidA

Я додав це до .git / config, але все ще з'являється "попередження: CRLF буде замінено LF"
Сергій

0

Робіть просто просту річ:

  1. Відкрийте git-hub (Shell) та перейдіть до файлу каталогу, що належить (cd / a / b / c / ...)
  2. Виконати dos2unix (колись dos2unix.exe)
  3. Спробуйте скористатися зараз. Якщо ви знову отримаєте ту саму помилку Виконайте всі вищезазначені дії, за винятком dos2unix, виконайте unix2dox (unix2dos.exe колись)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.