Git add --renormalize не выполняет повторную проверку моих файлов с правильными окончаниями строк

У меня есть репозиторий, который я использую между Windows и Linux.

В настоящее время некоторые файлы, например файл myfolder/myfile.txt, хранятся с окончаниями строк CRLF (DOS) и извлекаются с помощью строк CRLF.

На моей текущей машине (Linux) я хочу, чтобы все текстовые файлы всегда извлекались как окончания строк LF (Linux). Для этого я сделал следующее:

  1. Я убедился в git config --get core.autocrlfвыходахtrue. (В этом репозитории ничего не установлено; это глобальное значение.)

  2. Я создал файл .gitattributes со следующим содержимым:

    # Set the default behavior
    * text=auto
    
  3. я побежал

     git add --renormalize .
    

Затем я проверил с

git status

и он сказал мне:

On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitattributes

nothing added to commit but untracked files present (use "git add" to track)

Кроме того, в файле myfolder/myfile.txt все еще есть окончания строк CRLF.

Что здесь не так? Я хочу, чтобы все текстовые файлы были извлечены как окончания строк LF, и, насколько я понимаю в документации, опция --renormalize делает именно это. - Но не в моем случае.

Можете ли вы добавить вывод команды git ls-files --eol к вашему вопросу?

DecimalTurn 21.06.2024 23:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TLDR:

Эти конфигурации должны работать для вас в Linux и Windows (если вы не работаете с технологией, специфичной для Windows):

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

После того, как вы это сделаете, вам нужно заставить Git выполнить извлечение файла, который должен иметь LF в вашем рабочем каталоге. Один из способов сделать это — удалить его из рабочего каталога, а затем выполнить извлечение:

rm myfolder/myfile.txt
git checkout HEAD -- myfolder/myfile.txt

Если у вас есть core.autocrlf = true и для вашего файла установлен атрибут text (напрямую или через text=auto без указания атрибута eol), вы всегда будете получать CRLF для этого файла в своем рабочем каталоге при выполнении проверки.

Это имеет смысл с точки зрения имени «autocrlf», поскольку оно предназначено для автоматического преобразования CRLF при оформлении заказа для разработчиков Windows, но также обеспечивает преобразование любых новых файлов в LF при регистрации, чтобы разработчики Windows не вводили LF в репозиторий.

Ваша текущая конфигурация для извлечения текстовых файлов отмечена красным на следующей диаграмме.

Основываясь на предоставленной вами информации, я предполагаю, что окончание строки myfolder/myfile.txt внутри репозитория git уже LF, что объясняет, почему вы не видите никаких изменений, когда видите git status.

Теперь, если вы хотите исправить это и извлечь файл как LF, вы можете просто переключить autocrlf на false:

git config --global core.autocrlf false

Это поставит вас в ситуацию, отмеченную зеленым:

Что касается значения core.eol, у вас есть два основных варианта:

  1. Оставьте это значение неопределенным, что эквивалентно наличию git config --global core.eol native

Или (на мой взгляд, даже лучше):

  1. git config --global core.eol lf

Если вы выберете вариант 2, все файлы, хранящиеся с LF в репозитории, сохранят свои LF при извлечении, даже когда вы загружаетесь в Windows. Учитывая, что все современные программы Windows могут работать с LF, это не должно быть проблемой, и вы не столкнетесь с какими-либо проблемами, связанными с CRLF, вызывающими проблемы в ваших Docker-контейнерах.

Если вы работаете с технологиями, специфичными для Windows, вы всегда можете добавить определенные записи в свой файл .gitattributes, чтобы избежать наличия расширений LF, специфичных для Windows.

Например:

# INI file extension
*.[iI][nN][iI]              text eol=crlf

# Batch scripts (cmd, bat)
*.[cC][mM][dD]              text eol=crlf
*.[bB][aA][tT]              text eol=crlf

Заключительный этап

Однажды ты все это сделал. Затем вам нужно заставить Git выполнить извлечение файлов, которые должны иметь LF в вашем рабочем каталоге. Один из способов сделать это — удалить его из рабочего каталога, а затем выполнить извлечение:

rm myfolder/myfile.txt
git checkout HEAD -- myfolder/myfile.txt

Другой способ сделать это — удалить его из рабочего каталога (и индекса), а затем выполнить сброс:

git rm myfolder/myfile.txt
git reset --hard

Диаграмма, использованная в этом ответе, во многом вдохновлена ​​этого ответа с некоторыми улучшениями, основанными на внимательном прочтении документации и скрипте PowerShell для изучения различных сценариев. Полная версия доступна здесь.

См. также статью git's autocrlf=true считается вредным | markentier.tech


Обновления диаграммы:

  • Включение атрибута eol в часть checkout диаграммы делает ее более полной, поскольку eol, указанный в файле .gitattributes, имеет приоритет над core.autocrlf.

Какое замечательное объяснение и схема! Проверю, когда вернусь за рабочий компьютер в понедельник.

halloleo 22.06.2024 02:28

@halleo Звучит хорошо! Дайте мне знать, как идут дела. Обратите внимание, что я отредактировал свой ответ, чтобы обеспечить возможность получения LF в вашем рабочем каталоге сразу после изменения настроек. Я также отредактировал диаграмму, чтобы сделать ее более точной.

DecimalTurn 23.06.2024 18:59

Кажется, работает правильно. Спасибо. Нужно ли мне по-прежнему хранить файл .gitattributes, содержащий * text=auto?

halloleo 24.06.2024 03:53

@haloleo Это зависит от того, как вы используете репозиторий. Планируете ли вы предоставить вам или другим разработчикам доступ к этому репозиторию через Windows? Если да, вы можете оставить его там, чтобы предотвратить попадание любых CRLF в репо. Если нет, вы, безусловно, можете удалить его, поскольку преобразования все равно не произойдет.

DecimalTurn 24.06.2024 04:44

Другие вопросы по теме