git commit get fatal error "fatal: CRLF буде замінено на LF у"


84

Я використовую Ubuntu 13.10 x64 і працюю над проектом, який деякі розробники використовують Windows, нещодавно я змінив конфігурацію git core.eolна "lf" та core.autocrlfна "input" та core.safecrlfна "true". З тих пір, коли я намагаюся зафіксувати файл у своєму локальному сховищі, я отримую таку помилку:
fatal: CRLF would be replaced by LF in ......
з того, що я розумію, якщо встановити core.eolзначення "lf" і core.autocrlf"input", git автоматично перетворить CRLF в LF, але чому ця помилка виникає вийшов? Як я можу вирішити цю проблему?

Дякую.

Відповіді:


220

Це класичне питання:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(Картинка з Luis Tubes «s блозі )

Звичайне виправлення - це перетворення цих файлів самостійно за допомогою dos2unix або Swiss File Knife .

Я завжди вважав за краще тримати core.autocrlfвfalse , що означає:

git config --global core.autocrlf false

Це повідомлення про помилку навіть закрадається на git diffвиході: git.661346.n2.nabble.com/…
VonC

8
Чому git не може змінити для мене CRLF на LF, якщо я вже встановив core.autocrlfвведення?
aserww106

1
@William, тому що ви працюєте на Linux і з файлами, що надходять з Windows.
VonC

Дякую, @VonC, я вже використовую dos2unix для зміни всіх файлів eol, отже, коли розробники Windows прив'язують якийсь код до свого репо, якщо я витягну з їхнього сховища, git перетворить CRLF на LF, так? Наш git-сервер знаходиться на Ubuntu.
aserww106

1
@William Я маю на увазі, що ви сказали "Я нещодавно змінив git config core.eol" lfcore.autocrlf" input"": це не змінює файли, які там уже є. Це вплине на майбутнє git pull. Поточні файли все ще знаходяться в CRLF, і якщо їх змінити, вони перетворюються у LF, якщо це можливо, і, якщо ні, запускає повідомлення про помилку, про яке ви згадали.
VonC

55

У мене була та сама проблема, і я без успіху спробував запропоноване рішення.

Мені довелося виконати другу команду, щоб вона працювала:

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false

5
чи є негативні наслідки для цього додаткового редагування?
AlleyOOP

Спасибі пане! Допомога мені в 2020 році :)
Джо Спінеллі,

28
$ git config core.autocrlf false

3
Я не знаю, що це робить, але це працює. Фатальне попередження зникає, і я вже не боюся.
wh1tney

Я зробив це і тепер git diffрозглядаю весь файл (1000 рядків) як конфлікт. Інструменти різниці бачать лише 3 зміни рядка.
Dagrooms


4

Це трапилося зі мною на тисячах файлів. Тому я написав швидкий скрипт bash, щоб dos2unixвиправити це для мене. Хтось інший на Linux або Mac може виявитися корисним.

#!/usr/bin/env bash

unwindows() {

  local errmsg
  local fpath

  # base case
  errmsg="$(git add . 2>&1)"
  if [[ $? -eq 0 ]]; then
    echo 'Successfully converted CRLF to LF in all files.'
    echo 'Successfully ran "git add .".'
    echo 'Done.'
    return 0
  fi

  fpath="${errmsg#*fatal: CRLF would be replaced by LF in }"
  fpath="${fpath%.*}"

  if [[ "${fpath}" == "${errmsg}" ]]; then
    err 'Regex failed. Could not auto-generate filename from stderr.'
    return 1
  fi

  if [[ ! -e "${fpath}" ]]; then
    err "Regex failed. '${fpath}' does not exist."
    return 1
  fi

  if ! dos2unix "${fpath}"; then
    err "Failed to run \"dos2unix '${fpath}'\"."
    return 1
  fi

  # recursive case
  unwindows
}

err() {
  local -r msg="$1"
  echo "${msg}" >&2
}

unwindows

В основному, це намагається зробити git add .. Якщо команда не вдається, вона захоплює ім'я несумісного файлу з виводу помилки. Потім він запускається dos2unixна цьому файлі. Він продовжує повторювати цей процес, поки не git add .запрацює.

Якщо ви запускаєте це, ви повинні бачити dos2unix: converting file xxx to Unix format...неодноразово. Якщо ні, це не працює, тому просто натисніть ctrl+ cабо command+, cщоб зупинити це.


2
Якщо комусь цікаво, як мені вдалося зібрати тисячі незафіксованих файлів, це тому, що репо має купу зображень, створених кодом. Я не відкладав коміт на 3 роки або щось інше.
GreenRaccoon23

1

Вам потрібно додати всі файли, які git statusвідображаються як змінені:

git add file1
git add file2

А потім внесіть свої зміни:

git commit

Це збереже ваші локальні файли як є, але збереже autocrlfїх у віддаленому сховищі.


1

Я зіткнувся з тими ж проблемами і вирішив редагування, .gitattributesяк показано нижче.

$ vim .gitattributes

прокоментуйте 2 рядки в .gitattributes

-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf

1

FYI не впевнений, чи стосується це вас, але я отримав цю помилку при випадковій спробі додати все node_modulesдо поетапних змін. Так на самому ділі вирішити мою проблему..gitignoringnode_modules


0

Я працюю на Mac за допомогою Terminal і у мене виникла проблема з файлом .htaccess, який я намагався зафіксувати, отримавши фатальну помилку:

fatal: CRLF would be replaced by LF in .htaccess

Я хотів виправити проблему, як і запити OP, а не просто вимкнути git-прапор, тому я знайшов цю статтю, яка дає команду perl для усунення проблеми на основі кожного файлу.

perl -pi -e 's/\r\n/\n/g' input.file

Отже, для моєї помилки .htaccess вище, я запустив таке:

perl -pi -e 's/\r\n/\n/g' .htaccess 

Прапори -p, -i та -e (пиріг) можна поєднати, щоб дозволити редагувати файли за допомогою Perl із командного рядка. У цьому випадку заміна всіх знайдених \ r \ n на \ n.

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