Ich habe ein Git-Repository auf Github gehostet. Viele der Dateien wurden ursprünglich unter Windows entwickelt, und ich war nicht besonders vorsichtig mit Zeilenenden. Als ich das erste Commit durchführte, hatte ich auch keine Git-Konfiguration, um korrekte Zeilenenden zu erzwingen. Das Ergebnis ist, dass ich eine Reihe von Dateien mit CRLF-Zeilenenden in meinem Github-Repository habe.
Ich entwickle jetzt teilweise unter Linux und möchte die Zeilenenden bereinigen. Wie kann ich sicherstellen, dass die Dateien mit LF auf Github korrekt gespeichert werden und LF in meiner Arbeitskopie enthalten ist?
Ich habe eine .gitattributes
Datei eingerichtet, die Folgendes enthält text eol=LF
: Ist das korrekt? Kann ich mit diesem rm
Commit und Push nur mein lokales Repo erstellen und von Github neu klonen, um den gewünschten Effekt zu erzielen?
Antworten:
Ohne ein paar Informationen darüber, welche Dateien sich in Ihrem Repository befinden (reiner Quellcode, Bilder, ausführbare Dateien, ...), ist es ein bisschen schwierig, die Frage zu beantworten :)
Außerdem gehe ich davon aus, dass Sie bereit sind, standardmäßig LF als Zeilenenden in Ihrem Arbeitsverzeichnis zu verwenden, da Sie sicherstellen möchten, dass Textdateien LF-Zeilenenden in Ihrem .git-Repository haben, ob Sie unter Windows oder Linux arbeiten . In der Tat besser sicher als leid ....
Es gibt jedoch eine bessere Alternative: Profitieren Sie von LF-Zeilenenden in Ihrem Linux-Arbeitsverzeichnis, CRLF-Zeilenenden in Ihrem Windows-Arbeitsverzeichnis UND LF-Zeilenenden in Ihrem Repository.
Da Sie teilweise unter Linux und Windows arbeiten, stellen Sie sicher, dass
core.eol
aufnative
und eingestelltcore.autocrlf
isttrue
.Ersetzen Sie dann den Inhalt Ihrer
.gitattributes
Datei durch den folgendenAuf diese Weise kann Git die Konvertierung der automatischen Zeilenenden für Commits und Checkout-Vorgänge für Sie übernehmen. Binärdateien werden nicht geändert. Bei Dateien, die als Textdateien erkannt werden, werden die Zeilenenden im laufenden Betrieb konvertiert.
Da Sie jedoch den Inhalt Ihres Repositorys kennen, können Sie Git helfen und ihm helfen, Textdateien aus Binärdateien zu erkennen.
Wenn Sie an einem C-basierten Bildverarbeitungsprojekt arbeiten, ersetzen Sie den Inhalt Ihrer
.gitattributes
Datei durch den folgendenDadurch wird sichergestellt, dass Dateien mit der Erweiterung c, h oder txt mit LF-Zeilenenden in Ihrem Repo gespeichert werden und native Zeilenenden im Arbeitsverzeichnis haben. JPEG-Dateien werden nicht berührt. Alle anderen profitieren von der gleichen automatischen Filterung wie oben.
Um ein tieferes Verständnis für die inneren Details all dessen zu bekommen, würde ich Ihnen empfehlen, in diesen sehr guten Beitrag "Mind the end of your line" von Tim Clem, einem Githubber, einzutauchen.
Als Beispiel aus der Praxis können Sie auch einen Blick auf dieses Commit werfen , in dem diese Änderungen an einer
.gitattributes
Datei demonstriert werden.UPDATE zur Antwort unter Berücksichtigung des folgenden Kommentars
Macht Sinn. Danke für die Klarstellung. In diesem speziellen Kontext reicht die
.gitattributes
Datei allein nicht aus.Führen Sie die folgenden Befehle für Ihr Repository aus
Da Ihr Repository von Ihrer Linux- und Windows-Umgebung gemeinsam genutzt wird, wird die lokale Konfigurationsdatei für beide Umgebungen aktualisiert.
core.eol
stellt sicher, dass Textdateien an der Kasse LF-Zeilenenden tragen.core.autocrlf
stellt sicher, dass potenzielle CRLF in Textdateien (die beispielsweise aus einem Kopier- / Einfügevorgang resultieren) in Ihrem Repository in LF konvertiert werden.Optional können Sie Git unterscheiden helfen , was ist , indem Sie eine Textdatei
.gitattributes
Datei mit etwas ähnlich der folgenden:Wenn Sie eine
.gitattributes
Datei erstellen möchten, schreiben Sie sie fest .Stellen Sie zum Schluss sicher
git status
, dass "nichts festzuschreiben ist (Arbeitsverzeichnis bereinigt)" , und führen Sie dann den folgenden Vorgang ausDadurch werden Ihre Dateien in Ihrem Arbeitsverzeichnis neu erstellt, wobei Ihre Konfigurationsänderungen und die
.gitattributes
Datei berücksichtigt werden und möglicherweise übersehene CRLF in Ihren Textdateien ersetzt werden.Sobald dies erledigt ist, trägt jede Textdatei in Ihrem Arbeitsverzeichnis LF-Zeilenenden und
git status
sollte das Arbeitsverzeichnis weiterhin als sauber betrachten.quelle
vi
ist CRLF weniger zufrieden. Möchte ich es nur so ändern, dasscore.autocrlf
esfalse
(oderinput
) ist?git checkout-index --force --all
kann es besser funktionieren. Der zweite Punkt sieht in Bezug auf die ursprüngliche Frage etwas unangebracht aus. Wie wäre es mit einer speziellen Frage?text
undeol=lf
erzielen ?core.eol
core.autocrlf
git checkout-index --force --all
tut nichts für mich Was funktioniert, ist die Liste der Befehle in den GitHub-Anweisungen zur Behebung dieses Problems.Ab Git 2.10 (veröffentlicht am 03.09.2016) ist es nicht erforderlich, jede Textdatei einzeln aufzulisten. Git 2.10 hat das Verhalten von text = auto zusammen mit eol = lf behoben . Quelle .
.gitattributes
Datei im Stammverzeichnis Ihres Git-Repositorys:Fügen Sie es hinzu und legen Sie es fest.
Anschließend können Sie die folgenden Schritte ausführen, und alle Dateien werden jetzt normalisiert:
Quelle: Antwort von Kenorb .
quelle
Um LF-Zeilenenden für alle Textdateien zu erzwingen, können Sie eine
.gitattributes
Datei in der obersten Ebene Ihres Repositorys mit den folgenden Zeilen erstellen (nach Bedarf ändern):Dadurch wird sichergestellt, dass alle Dateien, die Git als Textdateien betrachtet, normalisierte (
LF
) Zeilenenden im Repository haben (normalerweisecore.eol
steuert die Konfiguration, welche Sie standardmäßig haben).Basierend auf den neuen Attributeinstellungen sollten alle Textdateien, die CRLFs enthalten, von Git normalisiert werden. Wenn dies nicht automatisch geschieht, können Sie ein Repository nach dem Ändern der Zeilenenden manuell aktualisieren, sodass Sie das Arbeitsverzeichnis mithilfe der folgenden Schritte erneut scannen und festschreiben können (vorausgesetzt, das Arbeitsverzeichnis ist sauber):
oder gemäß GitHub-Dokumentation :
Siehe auch: @ Charles Bailey Post .
Wenn Sie außerdem ausschließen möchten, dass Dateien nicht als Text behandelt werden, deaktivieren Sie deren Textattribut, z
Oder markieren Sie es explizit als binär:
Eine erweiterte Git-Normalisierungsdatei finden Sie
.gitattributes
unter Drupal-Kern :Siehe auch:
quelle
text=auto
ist irreführend. Sie können nichttext=auto
undeol
zusammen verwenden. Durch die Einstellung wirdeol
die automatische Erkennung von Textdateien deaktiviert. Aus diesem Grund müssen Sie alle diese Dateitypen angeben. Wennauto
aktiviert wäre, würden Sie das alles nicht brauchen. 2. Du brauchsttext
und nichteol=lf
.eol=lf
effektiv setzttext
.* text=auto eol=lf
der erste vontext=auto
überschrieben wirdeol=lf
. Wo haben Sie diese Funktion gefunden? Hier ist meine Quelle: stackoverflow.com/questions/29435156/…* text=auto eol=lf
dem Beispiel entfernt, da es auch aus Drupal entfernt wurde . Entfernen Sie auch Kommentare.