git commit ha un errore fatale “fatale: CRLF sarebbe stato sostituito da LF in”

Sto usando Ubuntu 13.10 x64, e sto lavorando su un progetto che alcuni sviluppatori stanno usando Windows, ho recentemente cambiato git config core.eol in “lf” e core.autocrlf in “input” e core.safecrlf in “true “. Da allora, quando provo a trasferire file nel mio repository locale, ottengo questo errore:
fatal: CRLF would be replaced by LF in ......
Da quello che ho capito, se avessi impostato core.eol su “lf” e core.autocrlf su “input”, git convertirà automaticamente CRLF in LF, ma perché questo errore viene fuori? Come posso risolvere questo problema?

Grazie.

Questo è un problema classico:

http://toub.es/sites/toub.es/files/styles/standard_article/public/field/image/firstcommit.png
(foto dal blog di Luis Tubes )

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

Ho sempre preferito mantenere core.autocrlf su false , il che significa:

 git config --global core.autocrlf false 

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 
 $ git config core.autocrlf false 

Si può semplicemente provare dos2unix:

 dos2unix [filename] 

Mi è successo su migliaia di file. Così ho scritto un rapido script bash per far sì che dos2unix lo dos2unix per me. Qualcun altro su Linux o Mac potrebbe trovare utile.

 #!/usr/bin/env bash _unwindows() { local errmsg; local filepath; # 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; filepath="${errmsg#*fatal: CRLF would be replaced by LF in }"; filepath="${filepath%.*}"; if [ "${filepath}" = "${errmsg}" ]; then echo "Regex failed. Could not auto-generate filename from stderr."; return 1; fi; if [ ! -e "${filepath}" ]; then echo "Regex failed. '${filepath}' does not exist."; return 1; fi; dos2unix "${filepath}"; if [ $? -ne 0 ]; then echo "Failed to run \`dos2unix '${filepath}'\`."; return 1; fi; # recursive case _unwindows; }; _unwindows; 

Fondamentalmente, prova a fare git add . . Se il comando fallisce, prende il nome del file incompatibile dall’output dell’errore. Quindi esegue dos2unix su quel file. Continua a ripetere questo processo fino a quando git add . lavori.

Se lo esegui, dovresti vedere dos2unix: converting file xxx to Unix format... ripetutamente. Se non lo fai, non funziona, quindi basta premere ctrl + c o comando + c per fermarlo.

È necessario aggiungere tutti i file che git status visualizza come modificato:

 git add file1 git add file2 

E poi commetti le tue modifiche:

 git commit 

Ciò manterrà i file locali così come sono, ma li autocrlf sul repository remoto.