In einem Projekt, in dem einige der Dateien ^ M als Zeilenumbruchtrennzeichen enthalten. Das Differenzieren dieser Dateien ist anscheinend unmöglich, da git-diff dies als eine einzige Zeile ansieht.
Wie unterscheidet man sich von der Vorgängerversion?
Gibt es eine Option wie "^ M als Newline behandeln, wenn Sie sich unterscheiden"?
prompt> git-diff "HEAD^" -- MyFile.as
diff --git a/myproject/MyFile.as b/myproject/MyFile.as
index be78321..a393ba3 100644
--- a/myproject/MyFile.cpp
+++ b/myproject/MyFile.cpp
@@ -1 +1 @@
-<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
+<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
prompt>
AKTUALISIEREN:
Jetzt habe ich ein Ruby-Skript geschrieben, das die letzten 10 Revisionen überprüft und CR in LF konvertiert.
require 'fileutils'
if ARGV.size != 3
puts "a git-path must be provided"
puts "a filename must be provided"
puts "a result-dir must be provided"
puts "example:"
puts "ruby gitcrdiff.rb project/dir1/dir2/dir3/ SomeFile.cpp tmp_somefile"
exit(1)
end
gitpath = ARGV[0]
filename = ARGV[1]
resultdir = ARGV[2]
unless FileTest.exist?(".git")
puts "this command must be run in the same dir as where .git resides"
exit(1)
end
if FileTest.exist?(resultdir)
puts "the result dir must not exist"
exit(1)
end
FileUtils.mkdir(resultdir)
10.times do |i|
revision = "^" * i
cmd = "git show HEAD#{revision}:#{gitpath}#{filename} | tr '\\r' '\\n' > #{resultdir}/#{filename}_rev#{i}"
puts cmd
system cmd
end
git diff -b
- ich habe dies in stackoverflow.com/a/46265081/58794 gezeigtgit diff --ignore-cr-at-eol
. Siehe meine Antwort unten .git diff -b
ist identisch mitgit diff --ignore-space-change
.Antworten:
GitHub schlägt vor, dass Sie sicherstellen sollten, dass Sie \ n nur als Zeilenumbruchzeichen in Repos verwenden, die mit Git behandelt werden. Es gibt eine Option zum automatischen Konvertieren:
Natürlich soll dies crlf in lf konvertieren, während Sie cr in lf konvertieren möchten. Ich hoffe das funktioniert noch ...
Und dann konvertieren Sie Ihre Dateien:
core.autocrlf wird auf der Manpage beschrieben .
quelle
git config core.whitespace cr-at-eol
.warning: LF will be replaced by CRLF
stattwarning: CRLF will be replaced by LF
, und ich bin in Linux. Irgendeine Idee warum? Ich möchte, dass alles mit LF endet, nicht mit CRLF!git config --global core.autocrlf input
die Schritte in dieser Antwort aus (rm, add, commit), und Sie erhaltenwarning: CRLF will be replaced by LF. The file will have its original line endings in your working directory.
. Entfernen Sie die Dateien (da sie die ursprüngliche, falsche CRLF haben) und checken Sie sie erneut aus dem letzten Commit "Fix CRLF" aus.Bei der Entwicklung unter Windows bin ich bei der Verwendung auf dieses Problem gestoßen
git tfs
. Ich habe es so gelöst:Dies sagt Git im Grunde, dass ein CR am Ende der Zeile kein Fehler ist. Als Ergebnis die lästigen
^M
erscheinen Zeichen nicht mehr am Ende der Zeilengit diff
,git show
usw.Es scheint, als ob andere Einstellungen unverändert bleiben. Beispielsweise werden zusätzliche Leerzeichen am Ende einer Zeile weiterhin als Fehler (rot hervorgehoben) im Diff angezeigt.
(Andere Antworten haben darauf hingewiesen, aber oben wird genau beschrieben, wie die Einstellung festgelegt wird. Um die Einstellung nur für ein Projekt festzulegen, lassen Sie die Option weg
--global
.)BEARBEITEN :
Nach vielen Schwierigkeiten am Zeilenende hatte ich das beste Glück, als ich in einem .NET-Team mit folgenden Einstellungen arbeitete:
Wenn Sie die Whitespace-Einstellung verwenden müssen, sollten Sie sie wahrscheinlich nur pro Projekt aktivieren, wenn Sie mit TFS interagieren müssen. Lassen Sie einfach das weg
--global
:Wenn Sie einige Core. * -Einstellungen entfernen müssen, können Sie diesen Befehl am einfachsten ausführen:
Dadurch wird Ihre globale .gitconfig-Datei in einem Texteditor geöffnet, und Sie können die zu entfernenden Zeilen problemlos löschen. (Oder Sie können '#' vor sie setzen, um sie zu kommentieren.)
quelle
core.autocrlf
auftrue
git config --global core.whitespace cr-at-eol
andere Standardeinstellungen deaktiviert. Es gibt drei Standardeinstellungen: blank-at-eol, blank-at-eof und Leerzeichen vor der Registerkarte. Um cr-at-eol zu aktivieren und gleichzeitig die anderen zu behalten, die Sie verwenden müsstengit config --global core.whitespace blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
.cr-at-eol
losgeworden^M
in am Ende der Liniengit diff
alles in Ordnung, aber GIT noch diese Zeilen als andere zeigte, obwohl die Linie Ende der einzige Unterschied war.Versuchen Sie
git diff --ignore-space-at-eol
, odergit diff --ignore-space-change
, odergit diff --ignore-all-space
.quelle
autocrlf
Einstellungen ändern musste . Vielen Dank!Siehe auch:
oder äquivalent,
wo
whitespace
steht ein Tabulatorzeichen .quelle
git show
) mich nicht mehr wegen des^M
s in den geänderten Zeilen nervt ! :)git diff
zeigt immer noch ^ M Zeichen.git config --global core.whitespace cr-at-eol
(wo --global optional ist, wenn Sie es nur auf dem Repo wollen, auf dem Sie sind)[core]
damit ich dascore.
Präfix durch ein TAB-Zeichen ersetzen kann .^M
ingit diff
, nicht darum , wie in ^ M in erster Linie nicht setzen. Das bedeutet, dass die akzeptierte Antwort auf Änderungencore.autocrlf
nicht die beste ist, da sie die Dateien ohne Bestätigung des Benutzers stillschweigend ändert.Warum bekommst du diese
^M
in deinegit diff
?In meinem Fall habe ich an einem Projekt gearbeitet, das unter Windows entwickelt wurde, und ich habe OS X verwendet. Als ich Code geändert habe, habe ich
^M
am Ende der Zeilen gesehen, die ich hinzugefügt habegit diff
. Ich denke, die^M
wurden angezeigt, weil sie andere Zeilenenden waren als der Rest der Datei. Da der Rest der Datei unter Windows entwickelt wurde, wurdenCR
Zeilenenden und unter OS XLF
Zeilenenden verwendet .Anscheinend hat der Windows-Entwickler bei der Installation von Git die Option " Windows-Stil auschecken, Zeilenenden im Unix-Stil festschreiben " nicht verwendet .
Was sollen wir also dagegen tun?
Sie können die Windows-Benutzer dazu bringen, git neu zu installieren und die Option " Windows-Stil auschecken, Zeilenenden im Unix-Stil festschreiben " zu verwenden. Dies ist, was ich bevorzugen würde, da ich Windows als Ausnahme in seinen Zeilenendezeichen sehe und Windows sein eigenes Problem auf diese Weise behebt.
Wenn Sie sich für diese Option entscheiden, sollten Sie jedoch die aktuellen Dateien korrigieren (da sie immer noch die
CR
Zeilenenden verwenden). Ich habe dies getan, indem ich die folgenden Schritte ausgeführt habe:Entfernen Sie alle Dateien aus dem Repository, jedoch nicht aus Ihrem Dateisystem.
Fügen Sie eine
.gitattributes
Datei hinzu, die bestimmte Dateien dazu zwingt, aLF
als Zeilenenden zu verwenden. Fügen Sie dies in die Datei ein:Ersetzen Sie
.ext
durch die Dateierweiterungen, die Sie abgleichen möchten.Fügen Sie alle Dateien erneut hinzu.
Dies zeigt Nachrichten wie folgt an:
Sie können die
.gitattributes
Datei entfernen , es sei denn, Sie haben hartnäckige Windows-Benutzer, die die Option " Windows-Stil auschecken, Zeilenenden im Unix-Stil festschreiben " nicht verwenden möchten .Alles festschreiben und vorantreiben.
Entfernen und überprüfen Sie die entsprechenden Dateien auf allen Systemen, auf denen sie verwendet werden. Stellen Sie auf den Windows-Systemen sicher, dass sie jetzt die Option " Windows-Stil auschecken, Zeilenenden im Unix-Stil festschreiben " verwenden. Sie sollten dies auch auf dem System tun, auf dem Sie diese Aufgaben ausgeführt haben, da beim Hinzufügen der Dateien git sagte:
Sie können Folgendes tun, um die Dateien zu entfernen:
Und dann, um sie mit den richtigen Zeilenenden zurückzubekommen:
Natürlich durch
.ext
die gewünschte Erweiterung ersetzen .Jetzt verwendet Ihr Projekt nur noch
LF
Zeichen für die Zeilenenden, und die bösenCR
Zeichen werden niemals wiederkommen :).Die andere Option besteht darin, Zeilenenden im Windows-Stil zu erzwingen. Sie können die
.gitattributes
Datei auch dafür verwenden.Weitere Informationen: https://help.github.com/articles/dealing-with-line-endings/#platform-all
quelle
View
-> gehenLine Endings
und auf klickenUnix
.^M
bedeutet das? Ist es eine Windows- oder Linux-Newline? Oder ist es nur eine "andere" Newline als die anderen Newlines in der Datei?git config --global core.autocrlf true
ist übertrieben, und die Anti-Windows / Anti-CR
Kampagne scheint tangential zu der Frage.Es wird einen mit Git 2.16 (Q1 2018) geben, da die
diff
Befehlsfamilie gelernt hat, Unterschiede im Wagenrücklauf am Zeilenende zu ignorieren.Siehe Commit e9282f0 (26. Oktober 2017) von Junio C Hamano (
gitster
) .Mit freundlicher Unterstützung von Johannes Schindelin (
dscho
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 10f65c2 , 27. November 2017)quelle
git config --global core.autocrlf true
wie in der akzeptierten Antwort festzulegen, beantwortet dies die Frage des OP direkter: "Gibt es eine Option wie" ^ M als Newline behandeln, wenn es anders ist "?"git version 2.20.1 (Apple Git-117)
das Hinzufügen der Antwort core.pager von Jason Pyeron wurde ebenfalls nicht behoben. YMMV offensichtlich.TL; DR
Ändern Sie den
core.pager
in"tr -d '\r' | less -REX"
, nicht den QuellcodeDeshalb
Die gezeigten lästigen ^ M sind ein Artefakt der Kolorierung und des Pagers. Dies wird durch
less -R
eine Standard-Git-Pager-Option verursacht. (Der Standard-Pager von git istless -REX
)Das erste, was zu beachten ist, ist, dass
git diff -b
keine Änderungen im Leerraum angezeigt werden (z. B. \ r \ n vs \ n).installieren:
Ein schneller Test zum Erstellen einer Unix-Datei und zum Ändern der Zeilenenden zeigt keine Änderungen mit
git diff -b
:Wir stellen fest, dass das Erzwingen einer Pipe auf weniger nicht das ^ M anzeigt, sondern die Farbe aktiviert und
less -R
Folgendes bewirkt:Die Korrektur wird mithilfe einer Pipe angezeigt, um das \ r (^ M) von der Ausgabe zu entfernen:
Eine unkluge Alternative ist die Verwendung
less -r
, da alle Steuercodes und nicht nur die Farbcodes durchlaufen werden.Wenn Sie nur Ihre Git-Konfigurationsdatei direkt bearbeiten möchten, ist dies der Eintrag zum Aktualisieren / Hinzufügen:
quelle
\r\n
Zeilenenden und einige\n
Zeilenenden hatten (ich weiß nicht, ob das relevant ist). Unterschiede der ersteren zeigten die^M
in den modifizierten Linien ( dh die+
Linien).core.autocrlf
wurde auf gesetzttrue
. Laufengit config core.pager "tr -d '\r' | less -REX"
hat die nervigen^M
s losgeworden . Vielen Dank!git diff -b
ist das, wonach ich gesucht habe, aber ich schätze die gründliche Erklärung.[core]
Abschnitts der git "config" -Datei durch Hinzufügenpager = tr -d '\\r' | less -REX
die einzige Antwort, die für mich funktioniert hat. Vielen Dank!Ich hatte lange mit diesem Problem zu kämpfen. Die bei weitem einfachste Lösung besteht darin, sich keine Gedanken über die ^ M-Zeichen zu machen und nur ein visuelles Diff-Tool zu verwenden, das sie verarbeiten kann.
Anstatt zu tippen:
Versuchen:
quelle
In meinem Fall war es dieser Befehl:
Quelle: https://public-inbox.org/git/[email protected]/T/
quelle
Wie von VonC festgestellt, ist dies bereits in Git 2.16+ enthalten. Leider unterscheidet sich der Name der Option (
--ignore-cr-at-eol
) von dem von GNU diff verwendeten Namen, den ich gewohnt bin (--strip-trailing-cr
).Als ich mit diesem Problem konfrontiert wurde, bestand meine Lösung darin, GNU diff anstelle des integrierten Git-Diff aufzurufen, da mein Git älter als 2.16 ist. Ich habe das mit dieser Kommandozeile gemacht:
Dies ermöglicht die Verwendung
--strip-trailing-cr
und anderer GNU-Diff-Optionen.Es gibt auch diesen anderen Weg:
Die konfigurierten Pager-Einstellungen werden jedoch nicht verwendet, weshalb ich die ersteren bevorzuge.
quelle