Git sagt “Binärdateien a… und b… unterscheiden sich” für *.reg-Dateien
Lesezeit: 6 Minuten
matpie
Gibt es eine Möglichkeit, Git zur Behandlung zu zwingen? .reg Dateien als Text? Ich verwende Git, um meine Windows-Registrierungsänderungen und Windows-Verwendungen zu verfolgen .reg für diese Dateien.
UPDATE 1: Ich habe es geschafft, ein Diff auszuführen (danke, Andrew). Nun sieht es aber wie folgt aus. Ist das ein Codierungsproblem?
index 0080fe3..fc51807 100644
--- a/Install On Rebuild/4. Registry Tweaks.reg
+++ b/Install On Rebuild/4. Registry Tweaks.reg
@@ -1,49 +1,48 @@
-<FF><FE>W^@i^@n^@d^@o^@w^@s^@ ^@R^@e^@g^@i^@s^@t^@r^@y^@ ^@E^@d^@i^@t^@o^@r^@
-^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;
-^@^M^@
...
Irgendwelche Ideen?
UPDATE 2: Vielen Dank an alle, die geholfen haben: Folgendes habe ich am Ende getan: Datei erstellen .gitattributes mit Inhalt *.reg text diff und dann habe ich die Dateien in UTF-8 konvertiert, da UTF-16 mit Diffs seltsam ist. Ich verwende keine fremden Zeichen, also funktioniert UTF-8 für mich.
Das ist UTF-16-codiert (wahrscheinlich könnte es UCS-2 sein, aber ich denke, die Stückliste wird nur für UTF verwendet)
– Ben Voigt
18. Februar 2011 um 22:07 Uhr
Möglicherweise ein Duplikat von stackoverflow.com/q/777949/166955
– Geoff Reedy
18. Februar 2011 um 22:14 Uhr
UTF-8 kann mit den gleichen “Fremdzeichen” umgehen wie UTF-16 🙂
– Paulo Ebermann
19. Februar 2011 um 0:23 Uhr
Für Leute, die die Idee nicht mögen, ihre Dateien konvertieren zu müssen: Eine bessere Möglichkeit, Diffs anzuzeigen, besteht darin, KDiff3 (oder ein anderes Diff-Tool) zu installieren, git zu konfigurieren, um es zu verwenden, und zu verwenden git difftool file.
– Bergius
9. Januar 2012 um 11:42 Uhr
Seien Sie vorsichtig beim Konvertieren von REG-Dateien in UTF-8. Mein Computer (Windows XP) konnte eine REG-Datei nach der Konvertierung nicht zusammenführen
– Patrik McDonald
10. Mai 2012 um 15:17 Uhr
Andreas Marschall
Um Git anzuweisen, einen Dateityp explizit zu unterscheiden, fügen Sie Folgendes in a ein .gitattributes Datei im Stammverzeichnis Ihres Repositorys:
*.reg diff
Das funktioniert bei mir nicht. Ich habe eine Datei erstellt .gitattributes und gib diesen Code genau ein.
– Matpie
18. Februar 2011 um 21:35 Uhr
Ich musste es ändern *.reg diff (kein Minus). Aber jetzt sieht alles komisch aus. Ich habe die Frage aktualisiert.
– Matpie
18. Februar 2011 um 21:46 Uhr
@nathanchere Aktualisiert, schien diesen Kommentar vor 4 Jahren verpasst zu haben.
– Andreas Marshall
7. Mai 2015 um 15:23 Uhr
Umständlicher Akkord
Schnelle Antwort
Wie andere bereits angemerkt haben, wird dieses Problem durch eine Codierungsverwechslung verursacht. Sie haben zwei Möglichkeiten:
Ändern Sie die Dateicodierung in UTF-8, indem Sie sie entsprechend erneut speichern.
Ein … kreieren .gitattributes Datei und fügen Sie Folgendes hinzu:
*.reg working-tree-encoding=UTF-16LE-BOM eol=CRLF
Weil
Standardmäßig werden Registrierungsexporte aus dem Windows-Registrierungs-Editor in einer bestimmten UTF-16-Codierung gespeichert. Unter der Haube unterstützt Git nur UTF-8 und seine Obermengen. Wenn Git also eine UTF-16-codierte Datei sieht, sieht es viele unerwartete Nicht-Zeichen-Bytes und interpretiert diese als Binärdatei.
Bitten Sie Git, die Datei als Text zu behandeln, indem Sie a *.reg diff -Attribut funktioniert nicht, da Git immer noch die falsche Codierung erwartet. Deshalb hast du all das gesehen ^@ Figuren.
Lösungen
Eine Lösung, die andere vorgeschlagen haben, besteht darin, die UTF-16-Dateien als UTF-8 zu speichern, und das funktioniert absolut! Es hat jedoch einen großen Nachteil: Wenn Sie viele .reg-Dateien haben oder einen Schlüssel aus dem Registrierungseditor erneut exportieren möchten, müssen Sie ihn jedes Mal mit der richtigen Codierung neu speichern.
Alternativ können Sie Git mitteilen, welche Codierung Sie verwenden möchten working-tree-encoding Attribut. Wenn dies angegeben ist, konvertiert Git eine Textdatei in UTF-8, wenn sie an das Repository übergeben wird, und konvertiert sie dann wieder in die ursprüngliche Codierung, wenn sie ausgecheckt wird. Auf diese Weise hat die Datei immer die ursprüngliche Codierung, wenn sie in Ihrem Arbeitsverzeichnis erscheint. Wenn Sie sich auskennen End-of-Line-Normalisierungdas Verhalten ist dem ähnlich.
Wenn Sie diesen Weg einschlagen, müssen Sie einige Fallstricke beachten:
Das Attribut ist relativ neu (März 2018), wenn Sie also breite Git-Implementierungen oder -Versionen unterstützen, könnte es Probleme geben.
Wenn Sie über kleine UTF-16-Dateien hinausgehen, kann die Codierungskonvertierung die Dinge verlangsamen oder, je nach Codierung, den Roundtrip nicht unbeschadet machen.
Aus diesen Gründen ist die Dokumentation empfiehlt, dieses Attribut nur dann zu verwenden, wenn die Datei nicht sinnvoll als UTF-8 gespeichert werden kann, aber abhängig von Ihrem Anwendungsfall können diese Fallstricke Sie nicht betreffen. Schließlich ist es bei der Verwendung dieses Attributs wichtig, auch anzugeben, welche Zeichen für das Zeilenende verwendet werden, um Mehrdeutigkeiten zu vermeiden. Das ist mit dem erledigt eol Attribut.
Alles in allem empfehle ich Ihnen, zu versuchen, eine zu erstellen .gitattributes Datei im Stammverzeichnis Ihres Repositorys und einschließlich der folgenden Zeile:
*.reg working-tree-encoding=UTF-16LE-BOM eol=CRLF
Das ist ausgezeichnet. Danke für den Hinweis auf das Neue working-tree-encoding Attribut.
– Matpie
30. August 2021 um 20:04 Uhr
Hey, vielen Dank! Ich hatte das Glück, das Attribut zu sehen. Danke für den Hinweis, dass das Attribut ebenfalls neu ist. Dies veranlasste mich, meiner Antwort einige der in der Dokumentation aufgeführten Fallstricke hinzuzufügen.
– Umständlicher Akkord
31. August 2021 um 7:44 Uhr
wnoise
Git behandelt Ihre Registrierungsexportdateien als Binärdateien, da sie NULs enthalten. Es gibt keinen guten Weg, um zu unterscheiden oder zusammenzuführen Allgemeines binäre Dateien. Eine Änderung von einem Byte kann die Interpretation des Rests der Datei ändern.
Es gibt zwei allgemeine Ansätze zur Handhabung von Binärdateien:
Akzeptiere, dass sie binär sind. Diffs werden nicht aussagekräftig sein, also fragen Sie nicht danach. Führen Sie sie niemals zusammen, was bedeutet, dass Sie nur Änderungen an einem Zweig zulassen. In diesem Fall kann dies vereinfacht werden, indem Sie jeden Tweak (oder Satz verwandter Tweaks) in eine separate Datei einfügen, sodass es weniger Möglichkeiten gibt, wie Unterschiede in einer Datei auftreten.
Speichern Sie die Änderungen als Text und konvertieren/dekonvertieren Sie in diese binären Formen.
Obwohl diese “Text”-Dateien die UTF-16-Codierung NULs enthalten. Es scheint jedoch keine Nicht-ASCII-Bits zu geben. Können Sie sie in ASCII (oder UTF-8, das ASCII sein wird, wenn es keine erweiterten Zeichen gibt) konvertieren?
Sie sind eigentlich Registry-Exporte. Ich sichere nicht die gesamte Registrierung. Ich bearbeite diese Dateien in Vim und sie sind nicht binär. Hier die betreffende Datei: gist.github.com/834529
– Matpie
18. Februar 2011 um 22:26 Uhr
@sirlancelot: Oh, richtig. Sie sind UTF-16 kodiert. Konvertieren Sie sie dann in und von UTF-8?
– wnoise
19. Februar 2011 um 4:04 Uhr
Konvertieren Sie .reg-Dateien von utf16 in utf8, indem Sie jede .reg-Datei im Editor öffnen und als Encoding UTF-8 speichern.
Das ist UTF-16-codiert (wahrscheinlich könnte es UCS-2 sein, aber ich denke, die Stückliste wird nur für UTF verwendet)
– Ben Voigt
18. Februar 2011 um 22:07 Uhr
Möglicherweise ein Duplikat von stackoverflow.com/q/777949/166955
– Geoff Reedy
18. Februar 2011 um 22:14 Uhr
UTF-8 kann mit den gleichen “Fremdzeichen” umgehen wie UTF-16 🙂
– Paulo Ebermann
19. Februar 2011 um 0:23 Uhr
Für Leute, die die Idee nicht mögen, ihre Dateien konvertieren zu müssen: Eine bessere Möglichkeit, Diffs anzuzeigen, besteht darin, KDiff3 (oder ein anderes Diff-Tool) zu installieren, git zu konfigurieren, um es zu verwenden, und zu verwenden
git difftool file
.– Bergius
9. Januar 2012 um 11:42 Uhr
Seien Sie vorsichtig beim Konvertieren von REG-Dateien in UTF-8. Mein Computer (Windows XP) konnte eine REG-Datei nach der Konvertierung nicht zusammenführen
– Patrik McDonald
10. Mai 2012 um 15:17 Uhr