Ich habe ein Repository geklont, das inkonsistente Zeilenenden hatte. Ich habe ein hinzugefügt .gitattributes
, das das Textattribut für die Dateien festlegt, die ich normalisieren möchte. Wenn ich jetzt Änderungen festschreibe, erhalte ich folgende Meldung:
warning: CRLF will be replaced by LF in FILE.
The file will have its original line endings in your working directory.
Wie kann ich Git dazu bringen, meine Arbeitskopie der Datei für mich zu normalisieren? Am liebsten möchte ich, dass git den gesamten Arbeitsbaum normalisiert.
git
line-endings
gitattributes
user11171
quelle
quelle
Antworten:
Mit Git Client 2.16 und höher gibt es jetzt eine viel einfachere Möglichkeit, dies zu tun. Benutz einfach:
Hinweis: Es ist besser, dies mit einem sauberen Arbeitsbereich zu tun. Einzelheiten finden Sie unter:
quelle
error: unknown option 'renormalize'
git --version
sagt das? Ich würde vermuten, dass es einfach älter als 2.16 ist und Sie ein Upgrade durchführen müssen. HTHgit status
gibt so etwas wienothing to commit, working tree clean
Für diejenigen, die Version 2.16 oder besser verwenden, können Sie einfach Folgendes verwenden:
Diese Anweisungen stammen direkt aus den Gitattributen . Für ältere Versionen bieten die Dokumente (vor Version 2.12) eine andere Antwort:
Führen Sie diese Sequenz aus, nachdem Sie sie bearbeitet haben
.gitattributes
.Aktualisieren
Es scheint, dass einige Benutzer Probleme mit den obigen Anweisungen hatten. Aktualisierte Dokumente für Gitattributes (2.12 bis 2.14) zeigen eine neue Anleitung (nach dem Bearbeiten der Gitattributes-Dateien):
Vielen Dank an @ vossad01 für diesen Hinweis.
Bei beiden Lösungen behalten die Dateien in Ihrer Arbeitskopie ihre alten Zeilenenden bei. Wenn Sie sie aktualisieren möchten, stellen Sie sicher, dass Ihr Arbeitsbaum sauber ist, und verwenden Sie:
Jetzt sind die Zeilenenden in Ihrem Arbeitsbaum korrekt.
quelle
.gitattributes
erstmaligen Hinzufügen oder Ändern der Einstellung, funktioniert jedoch nicht, wenn der Arbeitsbaum eine andere EOL hat (zumindest bei MsysGit nicht). Dafür scheint es, dassgit rm --cached -r .
und danngit reset --hard
funktioniert (Warnung: zerstört Ihren Arbeitsbaum). Von help.github.com/articles/dealing-with-line-endings .git add .
nach dem Entfernen des Index (unter Berücksichtigung aller zuvor nicht verfolgten Elemente im Arbeitsverzeichnis) vorgehen.git read-tree --empty; git add .
Variante. Alle verfolgten Dateien, die von .gitignore ignoriert werden, werden bei Verwendung gelöscht. Die Dokumentation empfiehlt jetztgit add --renormalize .
Alternativer Ansatz (unterscheidet sich nur im verwendeten Befehl)
Stellen Sie sicher, dass im Repository keine Änderungen anstehen:
Ändern Sie dies
.gitattributes
so, dass sich die CRLF-Interpretation ändert:Daten aus dem Index entfernen und Arbeitsverzeichnis aktualisieren:
Überprüfen Sie die von Git vorgeschlagenen CRLF-Korrekturen:
Stimmen Sie der Git-Entscheidung zu:
Laden Sie die Änderungen neu, als ob ein sauberer Klon durchgeführt worden wäre:
quelle
--eol
Option togit ls-files
ist neu in Git 2.8 (nicht mehr so neu, aber einige Leute leiden immer noch unter Git 1.7, sogar Ende 2018!).Die
.gitattributes
Einstellungen wirken sich nur auf neue Commits aus. Wenn in diesem Repository kein Verlauf veröffentlicht wurde (keine anderen hängen davon ab), möchten Sie möglicherweise den gesamten Verlauf durchgehen. Unter Unix / Linux können Siedos2unix(1)
alle Dateien in Kombination mit reparierenfind(1)
und mithilfe des Umschreibens des Verlaufsfilter-branch
(siehe Diskussion im Git-Buch) sogar den gesamten Verlauf des Projekts bereinigen.Mit größter Sorgfalt auf einem frischen Klon anwenden. Nehmen Sie Kontakt mit allen Personen auf, die möglicherweise einen Klon haben, und teilen Sie ihnen mit, was Sie tun möchten.
quelle
Die Option * text = auto in .gitattributes versetzt das Git-Repository in einen "unzulässigen Zustand", wenn es Dateien mit CRLF-Zeilenenden (Windows) enthält, die jetzt als Text markiert sind (siehe https://marc.info/?l=git&m) = 154484903528621 & w = 2 ). Die Standardoption zum Renormieren funktioniert mit den LFS-Filtern nicht richtig, daher funktionieren die Anweisungen in den anderen Antworten oder beispielsweise unter https://help.github.com/de/articles/dealing-with-line-endings nicht richtig . Stattdessen haben diese Schritte für uns funktioniert:
Lage:
Außerdem wurde -crlf für LFS-verfolgte Dateien in -text geändert, da nicht sicher ist, ob dies erforderlich ist.
quelle
Die
merge.renormalize
Konfigurationseinstellung kann hilfreich sein.quelle