2014-01-23 11 views
13

Vor kurzem stieß ich auf den folgenden Eintrag in einer .gitattributes Datei:Was macht "! Eol" in gitattributes?

"* text=auto !eol"

Was tut !eol?

+0

eol = Ende der Zeile (plausible Schätzung). '! eol' hätte höchstwahrscheinlich etwas mit * not * end-of-line zu tun. –

Antwort

2

Es deaktiviert grundsätzlich eol nach dem documentation:

Manchmal benötigen Sie eine Einstellung eines Attributs für einen Pfad zu unspezifisch Zustand außer Kraft zu setzen. Dies kann durch Auflisten des Namens des -Attributs, dem ein Ausrufezeichen vorangestellt ist, erfolgen.

eol macht folgende:

Dieses Attribut legt einen bestimmten Zeilenende-Stil im Arbeits Verzeichnis verwendet werden. Es aktiviert die End-of-Line-Normalisierung ohne Inhalt überprüft, effektiv das Textattribut festlegen.

1

Kurzversion:

Wenn Git entscheidet, dass der Inhalt Text ist, sind die Zeilenenden normalisiert auf checkin an LF. Setzen Sie in einer verschachtelten .gitattributes-Datei eine explizite eol-Einstellung zurück.

Siehe man gitattributes:

Each line in gitattributes file is of form: 

     pattern attr1 attr2 ... 

    Sometimes you would need to override an setting of an attribute for a path to 
    Unspecified state. This can be done by listing the name of the attribute 
    prefixed with an exclamation point !. 

    text 
     This attribute enables and controls end-of-line normalization. When a text 
     file is normalized, its line endings are converted to LF in the 
     repository. To control what line ending style is used in the working 
     directory, use the eol attribute for a single file and the core.eol 
     configuration variable for all text files. 

     Set to string value "auto" 
      When text is set to "auto", the path is marked for automatic 
      end-of-line normalization. If Git decides that the content is text, 
      its line endings are normalized to LF on checkin. 

    eol 
     This attribute sets a specific line-ending style to be used in the working 
     directory. It enables end-of-line normalization without any content 
     checks, effectively setting the text attribute. 
3
* text=auto !eol 

impliziert:

  • keine EOL (End of Line) Umwandlung für binäre Dateien durchgeführt werden würde.
  • für Textdateien werden EOLs auf OS-abhängige EOL umgewandelt (konvertiert für Unix und CR + LF für Windows LF) beim Auschecken der Datei und mit LF ersetzt, während bei der Prüfung.
+0

Warum ** NEIN ** EOL-Konvertierung? (Das '!' Ist zum Überschreiben, nicht für die Negation.) – michas

+0

@michas Ich bin mir nicht sicher, was Sie hier bezweifeln - '! Eol' in obigem gilt nur für Dateien, die __nicht__ Textdateien sind. – devnull

+0

@devnull Wie finden Sie, dass "! Eol" für Dateien gilt, die ** nicht ** Text sind? Es ist in der gleichen Zeile wie das '*' Wildcard, also bedeutet es für mich, dass es die explizite Einstellung für 'eol' entfernt, aber nicht sicher ist, was der Standard für' eol' ist. Dies würde für alle Dateien gelten, oder? Deine Antwort ist verwirrend. –

12

Git hat 2 Attribute, die sich mit End-of-Linien:

  1. Text

Dokumentation sagt:

Dieses Attribut aktiviert und steuert die End-of-Line-Normalisierung.Wenn eine Textdatei normalisiert wird, werden seine Zeilenende LF im Repository

umgewandelt Dies bedeutet effektiv, dass, wenn Sie an den Repo begehen, wird es Zeilenende konvertieren „an LF

  1. EOL

Dokumentation sagt:

Dieses Attribut legt einen bestimmten Zeilenende-Stil im Arbeitsverzeichnis verwendet werden. Es ermöglicht die End-of-Line-Normalisierung ohne Inhaltsüberprüfungen, wodurch das Textattribut effektiv festgelegt wird. So

während des Text Attribut beeinflusst, wie die Datei wie IM REPO aussehen wird, eol beeinflusst, wie die Datei wie im Arbeitsverzeichnis aussieht.

Nun kann ein Attribut 4 Zustände hat:

Satz ohne Wert
Beispiel: * text

ungesetzt
Beispiel: * -text

Satz mit bestimmtem Wert
Beispiel: * text=auto

unspeci fachter
Beispiel: * !text

So bedeutet * text=auto !eol dies:

Alle Dateien das Attribut Text auf Auto und das EOL-Attribut nicht spezifizieren haben. Wenn wir die Dokumentation lesen, finden wir heraus, dass text = auto bedeutet, dass Sie git entscheiden lassen, ob eine Datei Text ist und ob es normalisiert wird (setzen Sie Zeilenenden im Repo auf LF).

!eol bedeutet, dass das Attribut eol explizit auf unspezifiziert gesetzt ist. In diesem Fall ist es dasselbe, als würde es gar nicht spezifiziert, Git anzuweisen, die Einstellung core.eol config zu betrachten, um zu sehen, wie man mit Zeilenenden im Arbeitsverzeichnis umgehen kann. Hinweis:

Die Konfigurationsvariable core.eol steuert, welche Zeilenendungen Git für normalisierte Dateien in Ihrem Arbeitsverzeichnis verwendet. Standardmäßig wird die native Zeilenendung für Ihre Plattform oder CRLF verwendet, wenn core.autocrlf festgelegt ist.

Aber Sie würden verwenden EOL in einer Situation wie folgt aus:

* text=auto eol=CRLF 
test.txt !eol 

im Grunde das Überschreiben der EOL-Attribut von CRLF-nicht spezifiziert für test.txt. Dies bedeutet, dass Git für alle Dateien außer test.txt die Checkout-EOLs in CRLF konvertiert, aber nichts tut, um test.txt zu testen.