Was ist der Zweck von "text = auto" in der ".gitattributes" -Datei?

129

Meistens hat .gitattributesDatei * text=auto. Was ist der Zweck text=autoin dieser Datei?

Fizer Khan
quelle

Antworten:

77

Aus den Dokumenten :

Jede Zeile in .gitattributes(oder .git/info/attributes) Datei hat folgende Form:

pattern attr1 attr2 ...

Hier ist also das Muster *, dh alle Dateien, und das Attribut ist text=auto.

Was macht text=autodas Aus der Dokumentation:

Wenn der Text auf "auto" eingestellt ist, wird der Pfad für die automatische Normalisierung am Zeilenende markiert. Wenn Git entscheidet, dass der Inhalt Text ist, werden seine Zeilenenden beim Einchecken auf LF normalisiert.

Was ist das Standardverhalten, wenn es nicht aktiviert ist?

Nicht spezifiziert

Wenn das Textattribut nicht angegeben ist, verwendet Git die Konfigurationsvariable core.autocrlf, um zu bestimmen, ob die Datei konvertiert werden soll.

Was macht core.autocrlfdas Aus den Dokumenten:

   core.autocrlf

Das Setzen dieser Variablen auf "true" entspricht fast dem Setzen des Textattributs auf "auto" für alle Dateien, mit der Ausnahme, dass die Normalisierung von Textdateien nicht garantiert wird: Dateien, die CRLF im Repository enthalten, werden nicht berührt. Verwenden Sie diese Einstellung, wenn Sie CRLF-Zeilenenden in Ihrem Arbeitsverzeichnis haben möchten, obwohl das Repository keine normalisierten Zeilenenden hat. Diese Variable kann auf Eingabe gesetzt werden. In diesem Fall wird keine Ausgabekonvertierung durchgeführt.

Wenn Sie das alles so klar wie Schlamm finden, sind Sie nicht allein.

* text=autoIn meinen Worten bedeutet Folgendes: Wenn jemand eine Datei festschreibt, errät Git, ob es sich bei dieser Datei um eine Textdatei handelt, und wenn dies der Fall ist, wird eine Version der Datei festgeschrieben, in der alle CR + LF-Bytes durch LF-Bytes ersetzt werden. Es hat keinen direkten Einfluss darauf, wie Dateien im Arbeitsbaum aussehen. Es gibt andere Einstellungen, die LF-Bytes beim Auschecken einer Datei in CR + LF-Bytes konvertieren.

Empfehlung:

Ich würde nicht empfehlen, * text=autodie .gitattributesDatei einzutragen. Stattdessen würde ich so etwas empfehlen:

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

Dies gibt explizit an, welche Dateien Textdateien sind, die CRLF in der Objektdatenbank in LF konvertieren (aber nicht unbedingt im Arbeitsbaum). Wir hatten ein Repo mit * text=autound Git vermutete falsch für eine Bilddatei, dass es sich um eine Textdatei handelte, was dazu führte, dass sie beschädigt wurde, da CR + LF-Bytes durch LF-Bytes in der Objektdatenbank ersetzt wurden. Das Debuggen hat keinen Spaß gemacht.

Wenn Sie verwenden müssen * text=auto, geben Sie es als erste Zeile ein .gitattributes, damit die späteren Zeilen es überschreiben können. Dies scheint eine zunehmend populäre Praxis zu werden.

Flimm
quelle
2
Warum nennt jeder LF normal, aber nicht CRLF? Gibt es einen Schiedsrichter, der das beweist?
Yousha Aleayoub
1
@ YoushaAleayoub Was meinst du?
Flimm
1
@YoushaAleayoub Wenn Sie sich darauf everyonebeziehen, git-scmliegt dies wahrscheinlich daran, dass sie ein * nix-Paket entwickeln und daher die Verwendung von * nix-Zeilenumbrüchen normal ist .
Justin Moh
4
@YoushaAleayoub LF wird als "normal" angesehen, da es in vielen Entwicklungswerkzeugen üblich ist. Beliebte Entwickler-Tools wie git-scm* nix. MacOS verwendet LF. Nur Windows (nur unter Berücksichtigung von Mainstream-Betriebssystemen) verwendet CRLF. Dies macht es für Entwickler, die * nix-Tools unter Windows verwenden, und für alle beim Austausch von Dateien schwieriger. Siehe auch Warum CRLF .
Roi Danton
2
@Flimm, kannst du den Unterschied zwischen *.txt text=autound *.txt textbitte erklären ? Ich dachte, alle 4 Zeilen in Ihrem obigen Beispiel hätten sein sollen text=auto, nicht nur textnach der Dateierweiterung. Beispielsweise werden KiCad-Footprint-Dateien (Erweiterung ".kicad_mod") mithilfe dieser Zeile in ihrer gitattributes-Datei normalisiert: *.kicad_mod text=auto( kicad-pcb.org/libraries/klc/G1.7 ).
Gabriel Staples
64

Es stellt sicher, dass die Zeilenenden normalisiert werden. Quelle: Kernel.org

Wenn der Text auf "auto" eingestellt ist, wird der Pfad für die automatische Normalisierung am Zeilenende markiert. Wenn git entscheidet, dass der Inhalt Text ist, werden seine Zeilenenden beim Einchecken auf LF normalisiert.

Wenn Sie mit einem Quellcode-Verwaltungssystem zusammenarbeiten möchten, das die Normalisierung am Zeilenende erzwingt, oder einfach alle Textdateien in Ihrem Repository normalisieren möchten, sollten Sie stattdessen das Textattribut für alle Dateien auf "auto" setzen.

Dadurch wird sichergestellt, dass alle Dateien, die git als Text betrachtet, normalisierte Zeilenenden (LF) im Repository haben.

Dave Zych
quelle
12
Was meinst du mit normalisiertem Zeilenende?
Fizer Khan
14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych
11
Es ist wichtig zu wissen, dass dies die lokale core.autocrlf-Einstellung auf Ihrem Computer überschreibt. Sehen Sie diese großartige Antwort von @Daniel Jomphe
spankmaster79
1
Es wäre schrecklich schön, wenn git einfach nicht $% # mit einer der Dateien tun würde, die in das Repository eingecheckt werden. Ich habe mit SLM, PerForce, MsBuild, Source Depot, TFS und SVM gearbeitet. Keines davon ändert auch nur ein Byte in einer Ihrer Dateien. Dies ist ein heimtückischer Git-Hack IMO und hat mir große Schmerzen bereitet.
Vance McCorkle
1
Was an der Kasse passiert, ist nur die halbe Wahrheit - was passiert bei einem Kauf? Wäre es richtig zu sagen, dass die Zeilenenden an der Kasse LFauch unter Windows unverändert bleiben ?
Anthony
8

Diese Konfiguration bezieht sich auf den Umgang mit Zeilenenden. Wenn diese Option aktiviert ist, werden alle Zeilenenden im Repository in LF konvertiert. Es gibt andere Flags, die sich mit der Konvertierung von Zeilenenden in Ihrem Arbeitsverzeichnis befassen. Ausführliche Informationen zu diesem Thema finden Sie hier: https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

Karl Zöller
quelle