Вимкнути перетворення git EOL


100

Я намагаюся змусити git не змінювати будь-які закінчення рядків для будь-якої операції. На жаль, здається, це робиться незважаючи ні на що. Я звів його до наступного тесту, який містить стільки різних механізмів для відключення такої поведінки, скільки я міг знайти.


  • Почніть з двох машин (комп'ютер з Windows = A, комп'ютер з Linux = B)
  • На обох машинах: git config --global core.autocrlf false
  • На обох машинах: git config --global core.eol crlf(про всяк випадок)

  • Створіть нове сховище на А. З порожньої папки:
    • git init --shared(потім показати створений .gitкаталог)
    • Створіть новий файл .gitignoreу сховищі
    • Створіть новий файл .gitattributesу сховищі одним рядком:* -text
    • git add ., а потім git commit -m "initial commit"обійти, наприклад, це .
    • git branch master_recv
    • Додайте пульти дистанційного керування
  • Створіть новий файл document.txtу сховищі, що містить CRLF
  • Здійснити:, git add -Aтодіgit commit -m "<something>"
  • Зверніть увагу, що A document.txtвсе ще містить CRLF (і видалення та скидання з --hardповерненням версії, що все ще є CRLF)

  • SCP весь каталог на комп'ютер B
  • Додайте новий файл, new fileщо містить CRLF
  • Здійснити:, git add -Aтодіgit commit -m "<something>"
  • Зверніть увагу, що B document.txtі B new fileвсе ще містять CRLF

  • Потягніть майстра B до A: git pull <remote> master:master_recv
  • A document.txtзмінився на LF. Доданий файл new fileтакож містить LF.

Проблема не виникає, якщо B є машиною Windows.


Був core.autocrlf завжди був помилковим? Здається, у вас вже є \nзакінчення рядків у вашому сховищі? У вашому сховищі немає налаштувань, які можна змінити у вашому робочому каталозі. \n\r\n
Едвард Томсон,

Він не завжди встановлювався (наприклад, коли репо було створено спочатку). Однак у репо не повинно бути закінчень рядків CR. Крім того, знову ж таки, я не хочу, щоб якісь зміни відбулися.
imallett

Я запитую, оскільки ваша установка повинна зберігати закінчення рядків як CRLF. Не могли б ви опублікувати якийсь файл у своєму сховищі з його ідентифікатором об’єкта лише для мого (правда, напевне, дратує) побудови?
Едвард Томсон,

@EdwardThomson, як ви маєте на увазі? Репо не є загальнодоступним (оскільки машина Linux не є). Я припускаю, що ви хочете прикладний файл. Дивіться редагування.
imallett

Так, я погоджуюсь, що цей файл має закінчення рядків CRLF. Ви можете пояснити одне: ви згадали, що "нові рядки машини Windows змінюються на CR!" Звичайно, це була друкарська помилка, або ви дійсно отримуєте закінчення рядка зворотного перевезення каретки в стилі Mac OS 9?
Едвард Томсон,

Відповіді:


74

Усередині вашого проекту повинен бути .gitattributesфайл. Здебільшого це повинно виглядати нижче (або на цьому знімку екрана ):

# Handle line endings automatically for files detected as text 
# and leave all files detected as binary untouched.
* text=auto

# Never modify line endings of our bash scripts
*.sh -crlf

#
# The above will handle all files NOT found below
#
# These files are text and should be normalized (Convert crlf => lf)
*.css           text
*.html          text
*.java          text
*.js            text
*.json          text
*.properties    text
*.txt           text
*.xml           text

# These files are binary and should be left untouched
# (binary is macro for -text -diff)
*.class         binary
*.jar           binary
*.gif           binary
*.jpg           binary
*.png           binary

Змініть * text=autoна, * text=falseщоб вимкнути автоматичну обробку (див. Знімок екрана ).

Подобається це:

введіть тут опис зображення

Якщо у вашому проекті немає файлу .gitattributes, тоді закінчення рядків встановлюються вашими конфігураціями git. Щоб змінити конфігурації git, зробіть наступне:

Перейдіть до конфігураційного файлу в цьому каталозі:

1) C: \ ProgramData \ Git \ config

2) Відкрийте файл конфігурації в Notepad ++ (або будь-якому текстовому редакторі, який ви віддаєте перевагу)

3) Змініть "autocrlf =" на false.

введіть тут опис зображення


31
Навіщо використовувати картинки замість кодових тегів? Дуже незручно
Клінт,

31
Тому що я можу додати велике червоне поле на малюнку, щоб виділити речі.
Gene

21
Використання * text=falseне знімає текст: текст залишає значенням рядка значенням false. Це має такий самий ефект, як залишення тексту невизначеним (конкретно не встановленим). Використання * -textнадає йому особливі параметри скасування. Зняття текстового атрибута на шляху говорить git не намагатися перетворити кінець рядка під час реєстрації або оплати.
JustAMartin

Дякую @Gene за цю відповідь. Це зводило мене з розуму цілий день, і цей вирішив це для мене!
LeopardSkinPillBoxHat

7
Вибачте, що я не можу подякувати за цю відповідь. Мені коштувало півдня, щоб з’ясувати, що хтось дотримувався оманливих порад. Як зазначив @JustAMartin, * text=falseце не впливає. Виправте відповідь!
Пол Б.

47

Одне просте рішення:

  • переконайтесь, що для core.autocrlf встановлено значення false для всіх репозиторіїв:
    git config --global core.autocrlf false
  • повторно клонуйте свій репо та перевірте, чи не виконано перетворення EOL.
  • або, починаючи з Git 2.16 (Q1 2018) , збережіть поточний репо та виконайте agit add --renormalize .

Якщо перетворення виконуються автоматично, це означає, що .gitattributes core.eolдиректива знаходиться в репо.

У Git 2.8+ (березень 2016 р.) Перевірте, чи все ще існують трансформації eol за допомогою:

git ls-files --eol

2
ПРОСТО НЕ ВИКОРИСТОВУЙТЕ autocrlfСЬОГОДНІ! unsetted autocrlfеквівалентно false. Ви відставали від модних рухів у Git
Ледачий борсук

1
Як і вище, я спробував це (хоча і не зі світовим прапором), і це не спрацювало. версія git є 1.8.5.2.
imallett

@IanMallett "На даний момент здається, що машина Linux все ще має CRLF": це буде, поки ви не нормалізуєте її вміст або не
клонуєте

11

Я зрозумів це. Здається, програма SCP перетворювала закінчення рядків. Я помітив це, коли спробував навмисно створити файл із закінченнями LF, а потім зауважив, що при завантаженні він виглядав як CRLF.

Оскільки це було рішення для мене, я приймаю цю відповідь, але людям майбутнього слід також звернутися до інших відповідей для більш загального рішення.


1
Хороший улов, більш конкретний, ніж моя відповідь. +1
VonC

4

З gitattributes (5) Тема сторінки "Ефекти"

text

Цей атрибут дозволяє та контролює нормалізацію кінця рядка. Коли текстовий файл нормалізується, його закінчення рядків перетворюються у LF у сховищі. Щоб контролювати, який стиль закінчення рядка використовується в робочому каталозі, використовуйте eolатрибут для одного файлу та core.eol змінну конфігурації для всіх текстових файлів.

Set

Встановлення текстового атрибута на шляху дозволяє нормалізувати кінець рядка та позначає шлях як текстовий файл. Перетворення в кінці рядка відбувається без вгадування типу вмісту.

Unset Видалення атрибуту тексту на шляху говорить Git не намагатися перетворити кінець рядка під час реєстрації або оплати.

core.autocrlfв новому (1.7.2+) Git не використовується, core.eolі правильне налаштування | скасування атрибуту тексту вважається більш надійним способом


У .gitattributesфайлі я явно відключив усе як текст, правда? Крім того, я не бачу цього варіанту змусити його не робити перетворення (хоча crlfможе не мати ефекту)?
imallett

6
Важлива річ, яка часто плутається - щоб скасувати textта запобігти будь-яким перетворенням, вам слід встановити .gitattributes на, * -text а не на * text=false. falseне є дійсним значенням дляtext атрибута - git не розпізнає його і замість цього повернеться до налаштувань autocrlf за замовчуванням. Крім того, після зміни textзначення ви повинні зробити резервну копію всіх файлів з вашого локального репо, зробити коміт, потім відновити файли з правильним кінцем рядків, як вам потрібно, і зробити їх назад. Тоді ваші кінці рядків більше ніколи не будуть змінені git.
JustAMartin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.