Standardmäßig scheint es git
mit UTF-16 nicht gut zu funktionieren. Für eine solche Datei müssen Sie sicherstellen, dass keine CRLF
Verarbeitung durchgeführt wird, aber Sie möchten diff
und merge
wie eine normale Textdatei arbeiten (dies ignoriert, ob Ihr Terminal / Editor UTF-16 verarbeiten kann oder nicht).
.gitattributes
Wenn Sie sich jedoch die Manpage ansehen , sehen Sie hier das benutzerdefinierte Attribut binary
:
[attr]binary -diff -crlf
Daher scheint es mir, dass Sie ein benutzerdefiniertes Attribut in Ihrer obersten Ebene .gitattributes
für definieren können utf16
(beachten Sie, dass ich hier Zusammenführung hinzufüge, um sicherzustellen, dass es als Text behandelt wird):
[attr]utf16 diff merge -crlf
Von dort aus können Sie in jeder .gitattributes
Datei Folgendes angeben :
*.vmc utf16
Beachten Sie auch, dass Sie weiterhin in der Lage sein sollten, diff
eine Datei zu erstellen, auch wenn git
Sie der Meinung sind , dass sie binär ist mit:
git diff --text
Bearbeiten
Diese Antwort besagt im Grunde, dass GNU diff mit UTF-16 oder sogar UTF-8 nicht sehr gut funktioniert. Wenn Sie git
ein anderes Tool verwenden möchten, um Unterschiede (über --ext-diff
) zu erkennen, schlägt diese Antwort Guiffy vor .
Was Sie aber wahrscheinlich brauchen, ist nur diff
eine UTF-16-Datei, die nur ASCII-Zeichen enthält. Eine Möglichkeit, dies zum Laufen zu bringen, ist die Verwendung --ext-diff
des folgenden Shell-Skripts:
#!/bin/bash
diff <(iconv -f utf-16 -t utf-8 "$1") <(iconv -f utf-16 -t utf-8 "$2")
Beachten Sie, dass die Konvertierung in UTF-8 möglicherweise auch zum Zusammenführen funktioniert. Sie müssen lediglich sicherstellen, dass die Konvertierung in beide Richtungen erfolgt.
Wie für die Ausgabe an das Terminal, wenn ein Diff einer UTF-16-Datei betrachtet wird:
Der Versuch, sich so zu unterscheiden, führt dazu, dass binärer Müll auf den Bildschirm gespuckt wird. Wenn git GNU diff verwendet, scheint es, dass GNU diff nicht Unicode-fähig ist.
GNU diff kümmert sich nicht wirklich um Unicode. Wenn Sie also diff --text verwenden, unterscheidet es sich nur und gibt den Text aus. Das Problem ist, dass das von Ihnen verwendete Terminal das ausgegebene UTF-16 nicht verarbeiten kann (kombiniert mit den Diff-Markierungen, die ASCII-Zeichen sind).