git commit ottiene un errore irreversibile "fatal: CRLF verrebbe sostituito da LF in"


85

Sto usando Ubuntu 13.10 x64 e sto lavorando a un progetto che alcuni sviluppatori stanno usando Windows, ho recentemente cambiato git config core.eolin "lf" e core.autocrlfin "input" e core.safecrlfin "true". Da allora, quando provo a eseguire il commit del file nel mio repository locale, ottengo questo errore:
fatal: CRLF would be replaced by LF in ......
Da quello che ho capito, se imposto core.eolsu "lf" e core.autocrlfsu "input", git convertirà automaticamente CRLF in LF, ma perché viene questo errore su? Come posso risolvere questo problema?

Grazie.

Risposte:


221

Questo è un problema classico:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(foto da Luis Tubi s' post sul blog )

La solita soluzione è convertire quei file da soli, con dos2unix o Swiss File Knife .

Ho sempre preferito mantenere core.autocrlfafalse , il che significa:

git config --global core.autocrlf false

Quel messaggio di errore si insinua persino git diffnell'output: git.661346.n2.nabble.com/…
VonC

8
Perché git non può cambiare CRLF in LF per me se ho già impostato core.autocrlfl'input?
aserww106

1
@ William perché stai lavorando su Linux e con file provenienti da Windows.
VonC

Grazie, @VonC, uso già dos2unix per modificare tutti i file eol, quindi quando gli sviluppatori Windows inseriscono del codice nel loro repository, se eseguo il pull dal loro repository, git convertirà CRLF in LF, giusto? Il nostro server git è su Ubuntu.
aserww106

1
@ William, voglio dire che hai detto "Ho cambiato di recente i git config core.eolin" lf"e core.autocrlfin" input"": questo non cambia i file già presenti. Ciò avrebbe un impatto sul futuro git pull. I file correnti sono ancora in CRLF e, se modificati, vengono convertiti in LF se possibile e, in caso contrario, attiva il messaggio di errore menzionato.
VonC

56

Ho avuto lo stesso problema e ho provato la soluzione suggerita senza successo.

Ho dovuto eseguire un secondo comando per farlo funzionare:

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

5
ci sono conseguenze negative in questa modifica extra?
AlleyOOP

28
$ git config core.autocrlf false

3
Non so cosa faccia ma funziona. L'avvertimento fatale scompare e non ho più paura.
wh1tney

L'ho fatto e ora git diffvede il mio intero file (1000 righe) come un conflitto. Gli strumenti diff vedono solo 3 cambi di riga.
Dagrooms

10

Si può semplicemente provare dos2unix:

dos2unix [filename]

5

Questo è successo a me su migliaia di file. Quindi ho scritto un veloce script bash per dos2unixrisolvere il problema per me. Qualcun altro su Linux o Mac potrebbe trovarlo utile.

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

Fondamentalmente, cerca di fare git add .. Se il comando fallisce, acquisisce il nome del file incompatibile dall'output dell'errore. Quindi viene eseguito dos2unixsu quel file. Continua a ripetere questo processo finché non git add .funziona.

Se lo esegui, dovresti vedere dos2unix: converting file xxx to Unix format...ripetutamente. Se non lo fai, non funziona, quindi premi ctrl+ co command+ cper interromperlo.


2
Nel caso qualcuno sia curioso di sapere come sono riuscito a raccogliere migliaia di file non salvati, è perché il repository ha un mucchio di immagini generate dal codice. Non stavo posticipando un impegno per 3 anni o altro.
GreenRaccoon23

1

È necessario aggiungere tutti i file che git statusvengono visualizzati come modificati:

git add file1
git add file2

E poi salva le tue modifiche:

git commit

Ciò manterrà i tuoi file locali così come sono, ma autocrlfli manterrà nel repository remoto.


1

Ho affrontato gli stessi problemi e risolto con la modifica .gitattributescome di seguito.

$ vim .gitattributes

commentare 2 righe in .gitattributes

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

1

Cordiali saluti, non sono sicuro che questo si applichi a te, ma ho ricevuto questo errore durante il tentativo accidentale di aggiungere tutto node_modulesalle modifiche in fasi. Quindi in realtà .gitignoringl' node_modulesrisolto il mio problema.


0

Sono su un Mac che utilizza Terminal e ho riscontrato questo problema con un file .htaccess che stavo cercando di eseguire il commit, ottenendo l'errore fatale:

fatal: CRLF would be replaced by LF in .htaccess

Volevo risolvere il problema, come le richieste OP, non solo disattivare un flag git, quindi ho trovato questo articolo che fornisce un comando perl per risolvere il problema su base file.

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

Quindi, per il mio errore .htaccess sopra, ho eseguito quanto segue:

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

I flag -p, -i e -e (pie) possono essere combinati per permettervi di modificare i file usando Perl dalla riga di comando. In questo caso, sostituire tutto \ r \ n trovato con \ n.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.