Ich bin von dem Windows / Linux-Problem mit Git-Ending gebissen worden. Über GitHub, MSysGit und andere Quellen scheint es die beste Lösung zu sein, Ihre lokalen Repos so einzustellen, dass sie Zeilenenden im Linux-Stil verwenden, aber core.autocrlf
auf true
. Leider habe ich das nicht früh genug gemacht, so dass jetzt jedes Mal, wenn ich Änderungen ziehe, die Zeilenenden verzerrt sind.
Ich dachte, ich hätte hier eine Antwort gefunden, aber ich kann sie nicht für mich arbeiten lassen. Meine Linux-Kommandozeilenkenntnisse sind bestenfalls begrenzt, daher bin ich mir nicht einmal sicher, was die Zeile "xargs fromdos" in seinem Skript bewirkt. Ich erhalte immer wieder Nachrichten darüber, dass keine solche Datei oder kein solches Verzeichnis vorhanden ist. Wenn ich es schaffe, auf ein vorhandenes Verzeichnis zu verweisen, wird mir mitgeteilt, dass ich keine Berechtigungen habe.
Ich habe dies mit MSysGit unter Windows und über das Mac OS X-Terminal versucht.
quelle
Antworten:
Die Git-Dokumentation für Gitattributes dokumentiert jetzt einen anderen Ansatz zum " Korrigieren " oder Normalisieren aller Zeilenenden in Ihrem Projekt. Hier ist der Kern davon:
Dies nutzt ein neues
--renormalize
Flag, das in git v2.16.0, veröffentlicht im Januar 2018, hinzugefügt wurde. Für ältere Versionen von git gibt es einige weitere Schritte:quelle
git reset
bitte sagen, was der Zweck des ist?git status
ist das Ausführengit diff --ignore-space-at-eol
, um sicherzustellen, dass die einzigen Änderungen, die Sie vornehmen, die Zeilenenden sind.git reset
werden keine Änderungen erkannt und sind somit unbrauchbar.--renormalize
in git v2.16.0 hinzugefügte Flag zu nutzen, das im Januar 2018 veröffentlicht wurde. Das--renormalize
Flag konsolidiert den Prozess der erneuten Verarbeitung von Zeilenenden für jede verfolgte Datei in einem einzigen Befehl :git add --renormalize .
.Der einfachste Weg, dies zu beheben, besteht darin, ein Commit durchzuführen, das alle Zeilenenden behebt. Angenommen, Sie haben keine geänderten Dateien, können Sie dies wie folgt tun.
quelle
Mein Verfahren für den Umgang mit den Zeilenenden ist wie folgt (Kampf auf vielen Repos getestet):
Beim Erstellen eines neuen Repos:
.gitattributes
das allererste Commit zusammen mit anderen typischen Dateien als.gitignore
und einREADME.md
Beim Umgang mit einem bestehenden Repo:
.gitattributes
Entsprechend erstellen / änderngit commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
(--no-verify
ist es, Pre-Commit-Hooks zu überspringen)alias fixCRLF="..."
In
.gitattributes
Ich erkläre alle Textdateien explizit als LF EOL, da Windows-Tools im Allgemeinen mit LF kompatibel sind, während Nicht-Windows-Tools nicht mit CRLF kompatibel sind (selbst viele Befehlszeilentools von nodejs setzen LF voraus und können daher die EOL in Ihren Dateien ändern).Inhalt von
.gitattributes
Mein
.gitattributes
sieht normalerweise so aus:Um herauszufinden, welche unterschiedlichen Erweiterungen von git im aktuellen Repo verfolgt werden, klicken Sie hier
Probleme nach der Normalisierung
Sobald dies erledigt ist, gibt es noch eine weitere Einschränkung.
Angenommen, Sie
master
sind bereits auf dem neuesten Stand und normalisiert, und dann checken Sie ausoutdated-branch
. Sehr oft markiert git viele Dateien direkt nach dem Auschecken dieses Zweigs als geändert.Die Lösung besteht darin, ein falsches Commit (
git add -A . && git commit -m 'fake commit'
) durchzuführen und danngit rebase master
. Nach dem Rebase sollte das gefälschte Commit verschwinden.quelle
2.7.0.windows.1
ich Folgendes verwendet:git rm --cached -r . && git reset --hard && git add . && git commit -m "Normalize EOL" -n
Erläuterung:
git status --short
Dies zeigt jede Zeile an, die git kennt und nicht kennt. Dateien, die nicht unter Git-Kontrolle stehen, sind am Zeilenanfang mit einem '?' Gekennzeichnet. Geänderte Dateien sind mit einem M gekennzeichnet.
grep "^ *M"
Dadurch werden nur die Dateien herausgefiltert, die geändert wurden.
awk '{print $2}'
Dies zeigt nur den Dateinamen ohne Markierungen.
xargs fromdos
Dadurch werden die Dateinamen aus dem vorherigen Befehl übernommen und über das Dienstprogramm 'fromdos' ausgeführt, um die Zeilenenden zu konvertieren.
quelle
dos2unix
stattfromdos
.So habe ich alle Zeilenenden im gesamten Verlauf mit behoben
git filter-branch
. Das^M
Zeichen muss mitCTRL-V
+ eingegeben werdenCTRL-M
. Ich habedos2unix
die Dateien konvertiert, da dadurch automatisch Binärdateien übersprungen werden.quelle
Das "| xargs fromdos" liest aus der Standardeingabe (die Dateien
find
finden) und verwendet sie als Argumente für den Befehlfromdos
, der die Zeilenenden konvertiert. (Ist fromdos Standard in diesen Umgebungen? Ich bin an dos2unix gewöhnt). Beachten Sie, dass Sie die Verwendung von xargs vermeiden können (besonders nützlich, wenn Sie über genügend Dateien verfügen, sodass die Argumentliste für xargs zu lang ist):oder
Ich bin mir über Ihre Fehlermeldungen nicht ganz sicher. Ich habe diese Methode erfolgreich getestet. Welches Programm produziert jeweils? Für welche Dateien / Verzeichnisse haben Sie keine Berechtigungen? Hier ist jedoch ein Versuch zu erraten, was es sein könnte:
Eine einfache Möglichkeit, einen Fehler "Datei nicht gefunden" für das Skript zu erhalten, besteht darin, einen relativen Pfad zu verwenden - verwenden Sie einen absoluten. Ebenso kann ein Berechtigungsfehler auftreten, wenn Sie Ihr Skript nicht ausführbar gemacht haben (chmod + x).
Fügen Sie Kommentare hinzu und ich werde versuchen, Ihnen dabei zu helfen, es herauszufinden!
quelle
okay ... unter cygwin haben wir fromdos nicht leicht verfügbar, und dieser awk-Substeb explodiert in deinem Gesicht, wenn du Leerzeichen in Pfaden zu modifizierten Dateien hast (die wir hatten), also musste ich das etwas anders machen:
Ein großes Lob an @lloyd für den Großteil dieser Lösung
quelle
Befolgen Sie diese Schritte, wenn keine der anderen Antworten für Sie funktioniert:
git config --global core.autocrlf true
Folgendes: Wenn Sie unter Unix arbeiten, tun Sie diesgit config core.autocrlf input
git rm --cached -r .
.gitattributes
git add -A
git reset --hard
Dann sollte Ihr Einheimischer jetzt sauber sein.
quelle
.gitattributes
Datei ist die Lösung für das Problem mit den Zeilenenden?