Git sagt “Binärdateien a… und b… unterscheiden sich” für *.reg-Dateien

Lesezeit: 6 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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:

  1. Das Attribut ist relativ neu (März 2018), wenn Sie also breite Git-Implementierungen oder -Versionen unterstützen, könnte es Probleme geben.
  2. 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


Benutzer-Avatar
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:

  1. 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.

  2. 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.

Erstelle einen utf16toascii.py:

#!/usr/bin/env python3
import sys
data = open(sys.argv[-1]).read()
ascii = data.decode('utf-16').encode('ascii', 'replace')
sys.stdout.write(ascii)

Dann in bash tun:

$ echo "*.reg diff=utf16strings" >> .gitattributes
$ git config --global diff.utf16strings.textconv /path/to/utf16toascii.py

Und Sie können sowohl Registrierungsdateien als auch Xcode-Strings-Dateien oder andere UTF-16-Dateien unterscheiden.

  • Dies funktioniert nicht unter Windows und sollte mit Python 2 aufgerufen werden, nicht mit 3.

    – Michael Herrmann

    2. November 2021 um 8:58 Uhr

  • Dies funktioniert nicht unter Windows und sollte mit Python 2 aufgerufen werden, nicht mit 3.

    – Michael Herrmann

    2. November 2021 um 8:58 Uhr

1042880cookie-checkGit sagt “Binärdateien a… und b… unterscheiden sich” für *.reg-Dateien

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy