Qual è lo scopo di `text = auto` nel file` .gitattributes`?


129

Principalmente .gitattributesfile ha * text=auto. Qual è lo scopo di text=autoin quel file?

Risposte:


77

Dai documenti :

Ogni riga nel .gitattributes(o .git/info/attributes) file ha la forma:

pattern attr1 attr2 ...

Quindi qui, il modello è *, che significa tutti i file e l'attributo è text=auto.

Cosa fa text=auto? Dalla documentazione:

Quando il testo è impostato su "auto", il percorso è contrassegnato per la normalizzazione automatica di fine riga. Se Git decide che il contenuto è testo, le sue terminazioni di riga vengono normalizzate in LF al momento del check-in.

Qual è il comportamento predefinito se non è abilitato?

imprecisato

Se l'attributo text non è specificato, Git utilizza la variabile di configurazione core.autocrlf per determinare se il file deve essere convertito.

Cosa fa core.autocrlf? Dai documenti:

   core.autocrlf

L'impostazione di questa variabile su "true" è quasi uguale all'impostazione dell'attributo di testo su "auto" su tutti i file, tranne per il fatto che i file di testo non sono garantiti per essere normalizzati: i file che contengono CRLF nel repository non verranno toccati. Utilizzare questa impostazione se si desidera avere terminazioni di linea CRLF nella directory di lavoro anche se il repository non ha terminazioni di linea normalizzate. Questa variabile può essere impostata su input, nel qual caso non viene eseguita alcuna conversione di output.

Se pensi che sia tutto chiaro come il fango, non sei solo.

Ecco cosa * text=autofa nelle mie parole: quando qualcuno commette un file, Git indovina se quel file è un file di testo o meno, e se lo è, commetterà una versione del file in cui tutti i byte CR + LF vengono sostituiti con byte LF. Non influisce direttamente sull'aspetto dei file nell'albero di lavoro, esistono altre impostazioni che convertiranno i byte LF in byte CR + LF durante il checkout di un file.

Raccomandazione:

Vorrei non raccomandare mettere * text=autonel .gitattributesfile. Invece, consiglierei qualcosa del genere:

*.txt text
*.html text
*.css text
*.js text

Questo indica esplicitamente quali file sono file di testo, che ottengono CRLF convertiti in LF nel database degli oggetti (ma non necessariamente nell'albero di lavoro). Avevamo un repository * text=autoe Git aveva indovinato erroneamente che un file di immagine era un file di testo, causando il danneggiamento di esso poiché sostituiva i byte CR + LF con byte LF nel database degli oggetti. Non è stato divertente debug.

Se è necessario utilizzarlo * text=auto, inserirlo come prima riga .gitattributes, in modo che le righe successive possano sovrascriverlo. Questo sembra diventare una pratica sempre più popolare.


2
Perché tutti chiamano LF come normale ma non CRLF? c'è qualche riferimento per dimostrarlo?
Yousha Aleayoub,

1
@YoushaAleayoub Cosa intendi?
Flimm,

1
@YoushaAleayoub se ti everyoneriferisci git-scm, è probabilmente perché stanno sviluppando un pacchetto * nix e quindi l'utilizzo del carattere di nuova riga * nix è normale .
Justin Moh,

4
@YoushaAleayoub LF è considerato "normale" b / c ed è comune in molti strumenti di sviluppo. Strumenti di sviluppo popolari come git-scmprovenienti da * nix. MacOS utilizza LF. Solo Windows (considerando solo i SO del flusso principale) utilizza CRLF. Questo rende più difficile per gli sviluppatori che utilizzano gli strumenti * nix su Windows e per tutti durante lo scambio di file. Vedi anche Perché CRLF .
Roi Danton,

2
@Flimm, puoi spiegare la differenza tra *.txt text=autoe per *.txt textfavore? Ho pensato che tutte e 4 le righe del tuo esempio sopra avrebbero dovuto essere text=auto, non solo textdopo l'estensione del file. I file di footprint di KiCad, ad esempio (estensione ".kicad_mod"), vengono normalizzati usando questa riga nel loro file gitattributes: *.kicad_mod text=auto( kicad-pcb.org/libraries/klc/G1.7 ).
Gabriel Staples,

64

Assicura che le terminazioni di linea siano normalizzate. Fonte: Kernel.org

Quando il testo è impostato su "auto", il percorso è contrassegnato per la normalizzazione automatica di fine riga. Se git decide che il contenuto è testo, le sue terminazioni di riga vengono normalizzate in LF al momento del check-in.

Se si desidera interagire con un sistema di gestione del codice sorgente che impone la normalizzazione di fine riga o si desidera semplicemente normalizzare tutti i file di testo nel proprio repository, è necessario invece impostare l'attributo di testo su "auto" per tutti i file.

Questo assicura che tutti i file che Git considera essere di testo avranno terminazioni di linea normalizzate (LF) nel repository.


12
Cosa intendi per fine linea normalizzata?
Fizer Khan,

14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych,

11
Importante da sapere, questo sovrascrive l'impostazione core.autocrlf locale sulla tua macchina, vedi questa grande risposta di @Daniel Jomphe
spankmaster79

1
Sarebbe terribilmente bello se git semplicemente non eseguisse $% # con nessuno dei file archiviati nel repository. Ho lavorato con SLM, PerForce, MsBuild, Source Depot, TFS, SVM, nessuno di questi cambierà nemmeno un byte in nessuno dei tuoi file. Questo è un insidioso git hacking IMO e mi ha causato molto dolore.
Vance McCorkle,

1
Quello che succede al checkout è solo metà della storia - cosa succede dopo un get? Sarebbe giusto dire che al momento del checkout, le terminazioni delle righe rimangono come LF, anche su Windows?
Anthony,

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.