2013-03-17 9 views
44

Quando provo a commettere alcuni file modificati, ottengo il seguente messaggio di errore con TortoiseGitCercando di commettere i file di Git ma ottenendo :: fatale: LF verrebbe sostituito da CRLF in <alcuni file nella repo>

fatal: LF would be replaced by CRLF in <some file in the repo>

Ora, prima di ricevere le solite risposte LF vs CRLF, so e capisco di cosa tratta il dibattito. In secondo luogo, ho anche impostato le mie impostazioni globali:

core.autocrlf true

In terzo luogo, I've got a .gitattributes file.

Quindi, voglio accertarmi che i file siano forzati ad avere CRLF.

Quello che non capisco è che sta dicendo FATAL e mi impedisce di continuare. Un avvertimento? Sicuro! So cosa sto cercando di fare? Lo voglio!

Voglio solo che converta in silenzio e STFU.

In alternativa, se è costretto a BLOCCARLO, c'è un modo per aggiornare tutti i file nel repository per essere CRLF, quindi questo avviso può essere perso?

Queste repo sono private, quindi non verranno mai sviluppate al di fuori di Windows + Visual Studio.

Qualcuno può aiutare per favore senza denigrare questa discussione in una guerra religiosa autocrlf TRUE vs autocrlf FALSE.

risposta

56

È possibile impostare core.safecrlf su "avviso", se si desidera solo un avviso e non un errore irreversibile.

Da "git config" mange page:

core.safecrlf

Se true, rende controllo git se la conversione CRLF è reversibile quando la conversione di fine linea è attiva. Git verificherà se un comando modifica un file nell'albero di lavoro direttamente o indirettamente.
Ad esempio, il commit di un file seguito dal controllo dello stesso file dovrebbe produrre il file originale nell'albero di lavoro. In caso contrario, git rifiuterà il file.
La variabile può essere impostata su "warn", nel qual caso git avverte solo di una conversione irreversibile ma continua l'operazione.

Conversione CRLF ha una leggera possibilità di danneggiare i dati.
Quando è abilitato, git convertirà CRLF in LF durante il commit e LF in CRLF durante il checkout.
Un file che contiene una combinazione di LF e CRLF prima che il commit non possa essere ricreato da git.
Per i file di testo questa è la cosa giusta da fare: corregge le terminazioni di riga in modo tale che nel repository abbiamo solo terminazioni di linea LF.
Ma per i file binari che vengono accidentalmente classificati come testo, la conversione può danneggiare i dati.

Se si riconosce tale corruzione anticipo si può facilmente risolvere il problema impostando il tipo di conversione in modo esplicito in .gitattributes.
Subito dopo il commit, il file originale è ancora presente nell'albero di lavoro e questo file non è ancora danneggiato. Puoi dire esplicitamente a git che questo file è binario e git gestirà il file in modo appropriato.

Sfortunatamente, l'effetto desiderato di pulizia dei file di testo con terminazioni di linea miste e l'effetto indesiderato di file binari corrompere non può essere distinto.
In entrambi i casi i CRLF vengono rimossi in modo irreversibile. Per i file di testo questa è la cosa giusta da fare perché i CRLF sono terminazioni di riga, mentre per i file binari la conversione di CRLF danneggia i dati.

preferisco identificare i file esatto o tipi di file voglio forzare l'EOL con .gitattributes file solo (con core.eol impostazioni, che si deve), e lasciare autocrlf su false.

In caso di fiels testo con EOL mista, questo blog post suggerisce, per esempio, a:

Se si dispone di Notepad ++ installato nel computer, è sufficiente attenersi alla seguente procedura.

  1. Aprire il file che presenta il problema irreversibile.
  2. Clicca Edit -> EOL Conversion quindi selezionare il formato di Windows o ad uno qualsiasi che hai un problema di commettere.
+0

Risposta molto bella! Domande: 1. Perché git vuole memorizzare LF nel commit (cioè convertire CRLF -> LF e viceversa nell'altro)? In realtà pensavo che stesse facendo il reverse * blush * ... salvando LF come CRLF. (Ho anche lamentato che Windows è il mostro qui con CRLF EOL mentre altri OS sono * generalmente * LF). 2. Se imposto AutoCrlF su falso .. quale sarebbe una riga di esempio in '.gitattributes'? Esattamente quello che ho? Quindi il mio file '.gitattributes' correggerebbe la conversione? –

+0

@ Pure.Krome 1. git per impostazione predefinita converte eol rispetto al sistema operativo su cui si intendeva eseguire inizialmente: Linux. 2. se 'core.autocl' è impostato su false, quindi puoi controllare la conversione eol con 'core.eol', quindi sì, il tuo file' .gitattributes' sembra buono, devi solo testarlo/completarlo per coprire i file che vuoi effettivamente convertire. – VonC

+0

Ho avuto questo problema quando ho permesso a pgAdmin di salvare su un file che stavo scrivendo con Notepad ++. Proprio come un testa a testa. –

5

Ciò disabiliterà l'avviso di errore irreversibile.

git config core.autocrlf false 
git config core.safecrlf false 
14
git config --global core.safecrlf false 
+0

Questo mi aiuta molto. In effetti funziona per me. Non so perché le altre guide non sono adatte a me. – Tung

1

git config --global core.autocrlf false sarà checkin i file con CRLF, che non è abituato a.

Ho notato su Windows, che con core.autocrlf true git non piacciono i file con LF e core.autocrlf input non piace CRLF.

Quindi: salvare file CRLF con core.autocrlf true e file LF con core.autocrlf input (o convertirli in CRLF).

file Di solito con LF viene generata automaticamente da generatori di codice (ad esempio https://start.spring.io o http://yeoman.io/)

Problemi correlati