git commit get fatal error „fatal: CRLF zostanie zastąpiony przez LF in”

84

Używam Ubuntu 13.10 x64 i pracuję nad projektem, w którym niektórzy programiści używają systemu Windows. Niedawno zmieniłem konfigurację git core.eolna „lf” oraz core.autocrlfna „input” i core.safecrlf„true”. Od tego czasu, kiedy próbuję zatwierdzić plik do mojego lokalnego repozytorium, pojawia się ten błąd:
fatal: CRLF would be replaced by LF in ......
Z tego co rozumiem, jeśli ustawię core.eolna "lf" i core.autocrlf"input", git automatycznie przekonwertuje CRLF na LF, ale dlaczego ten błąd przyjdzie na zewnątrz? Jak mogę rozwiązać ten problem?

Dziękuję Ci.

aserww106
źródło

Odpowiedzi:

220

To klasyczny problem:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(zdjęcie z Luis Tubes „s blogu )

Zwykłą poprawką jest samodzielne przekonwertowanie tych plików za pomocą dos2unix lub Swiss File Knife .

Zawsze wolał trzymać core.autocrlfsięfalse , co oznacza:

git config --global core.autocrlf false
VonC
źródło
Ten komunikat o błędzie pojawia się nawet na git diffwyjściu: git.661346.n2.nabble.com/ ...
VonC
8
Dlaczego git nie może zmienić CRLF na LF dla mnie, skoro już ustawiłem core.autocrlfna wejście?
aserww106
1
@William, ponieważ pracujesz w systemie Linux i na plikach pochodzących z systemu Windows.
VonC
Dziękuję, @VonC, już używam dos2unix do zmiany wszystkich plików eol, więc kiedy programiści Windows wprowadzą jakiś kod do swojego repozytorium, jeśli ściągnę z ich repozytorium, git przekonwertuje CRLF na LF, prawda? Nasz serwer git działa na Ubuntu.
aserww106
1
@William Chodzi mi o to, że powiedziałeś "Niedawno zmieniłem na git config core.eol" lf"i core.autocrlfna" input"": to nie zmienia plików, które już tam są. Miałoby to wpływ na przyszłość git pull. Bieżące pliki nadal znajdują się w CRLF, a jeśli są zmodyfikowane, są konwertowane na LF, jeśli to możliwe, a jeśli nie, wyzwala wspomniany komunikat o błędzie.
VonC,
55

Miałem ten sam problem i bezskutecznie wypróbowałem sugerowane rozwiązanie.

Musiałem wykonać drugie polecenie, aby zadziałało:

$ git config --global core.autocrlf false
$ git config --global core.safecrlf false
almo
źródło
5
czy są jakieś negatywne konsekwencje tej dodatkowej zmiany?
AlleyOOP
Dziękuję Panu! Pomagają mi w 2020 roku :)
Joe Spinelli
28
$ git config core.autocrlf false
Bieg
źródło
3
Nie wiem, co to robi, ale działa. Fatalne ostrzeżenie znika i już się nie boję.
wh1tney
Zrobiłem to i teraz widzę git diffcały mój plik (1000 linii) jako konflikt. Narzędzia porównywania widzą tylko 3 zmiany liniowe.
Dagrooms
10

Można po prostu spróbować dos2unix:

dos2unix [filename]
Yola
źródło
4

Zdarzyło mi się to na tysiącach plików. Napisałem więc szybki skrypt basha, aby dos2unixnaprawić to za mnie. Ktoś inny w systemie Linux lub Mac może uznać to za przydatne.

#!/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

Zasadniczo próbuje to zrobić git add .. Jeśli polecenie nie powiedzie się, pobiera nazwę niezgodnego pliku z danych wyjściowych błędu. Następnie działa dos2unixna tym pliku. Powtarza ten proces, aż git add .zadziała.

Jeśli to uruchomisz, powinieneś zobaczyć dos2unix: converting file xxx to Unix format...wielokrotnie. Jeśli nie, to nie działa, więc po prostu naciśnij ctrl+ club command+, caby go zatrzymać.

GreenRaccoon23
źródło
2
Jeśli ktoś jest ciekawy, jak udało mi się zebrać tysiące niezatwierdzonych plików, dzieje się tak dlatego, że repozytorium zawiera kilka obrazów wygenerowanych przez kod. Nie odkładałem zobowiązania na 3 lata ani nic.
GreenRaccoon 23
1

Musisz dodać wszystkie pliki, które git statussą wyświetlane jako zmodyfikowane:

git add file1
git add file2

A następnie zatwierdź zmiany:

git commit

Spowoduje to zachowanie lokalnych plików bez zmian, ale pozostaną autocrlfone w zdalnym repozytorium.

Karl S.
źródło
1

Napotkałem ten sam problem i naprawiłem edycję, .gitattributesjak poniżej.

$ vim .gitattributes

zakomentuj 2 linie w .gitattributes

-* text=auto
-* text eol=lf
+# * text=auto
+# * text eol=lf
Kazma Arakaki
źródło
1

Nie jestem pewien, czy to dotyczy Ciebie, ale otrzymywałem ten błąd, gdy przypadkowo próbowałem dodać wszystko node_modulesdo etapowych zmian. Więc faktycznie rozwiązać mój problem..gitignoringnode_modules

Nickofthyme
źródło
0

Jestem na komputerze Mac z terminalem i miałem ten problem z plikiem .htaccess, który próbowałem zatwierdzić, otrzymując błąd krytyczny:

fatal: CRLF would be replaced by LF in .htaccess

Chciałem rozwiązać problem, taki jak żądania OP, a nie tylko wyłączyć flagę git, więc znalazłem ten artykuł, który zawiera polecenie Perla, aby rozwiązać problem na podstawie pliku.

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

Więc dla mojego błędu .htaccess powyżej, uruchomiłem następujące polecenie:

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

Flagi -p, -i i -e (pie) można łączyć, aby umożliwić edycję plików za pomocą Perla z wiersza poleceń. W tym przypadku zastąpienie wszystkich znalezionych \ r \ n \ n.

thetwopct
źródło