Ich verfolge eine virtuelle PC-Maschinendatei (* .vmc) in git und nach einer Änderung identifizierte git die Datei als binär und würde sie für mich nicht unterscheiden. Ich habe festgestellt, dass die Datei in UTF-16 codiert wurde.
Kann man Git beibringen, zu erkennen, dass es sich bei dieser Datei um Text handelt, und sie angemessen zu behandeln?
Ich verwende git unter Cygwin, wobei core.autocrlf auf false gesetzt ist. Bei Bedarf kann ich mSysGit oder git unter UNIX verwenden.
Es gibt eine sehr einfache Lösung, die bei Unices sofort funktioniert.
Zum Beispiel mit Apples
.strings
Dateien nur:Erstellen Sie eine
.gitattributes
Datei im Stammverzeichnis Ihres Repositorys mit:Fügen Sie Ihrer
~/.gitconfig
Datei Folgendes hinzu :Quelle: Diff .strings-Dateien in Git (und älterer Beitrag von 2010).
quelle
iconv
ist "ein anderes Tool" genauso wie Vim oder Beyond Compare (nicht Teil der Git-Suite).vimdiff
undiconv
beide sind bereits auf macOS vorhanden, sodass Sie sich nicht fragen müssen, wo sie erhältlich sind, und sie erledigen den JobHaben Sie versucht, Ihre
.gitattributes
so einzustellen, dass sie als Textdatei behandelt wird?z.B:
Weitere Informationen finden Sie unter http://www.git-scm.com/docs/gitattributes.html .
quelle
set
unddiff
...*.vmc diff
,*.sql diff
etc .. benötigt wird , um das ‚diff‘ Attribut für den Pfad angegeben einzustellen. (Ich kann die Antwort nicht bearbeiten). 2 Vorbehalte: Unterschiede werden mit einem Leerzeichen zwischen den einzelnen Zeichen angezeigt und es ist nicht möglich, für diese problematischen Dateien "Stage Hunk" oder "Discard Hunk" zu erstellen.Standardmäßig scheint es
git
mit UTF-16 nicht gut zu funktionieren. Für eine solche Datei müssen Sie sicherstellen, dass keineCRLF
Verarbeitung durchgeführt wird, aber Sie möchtendiff
undmerge
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 Attributbinary
:Daher scheint es mir, dass Sie ein benutzerdefiniertes Attribut in Ihrer obersten Ebene
.gitattributes
für definieren könnenutf16
(beachten Sie, dass ich hier Zusammenführung hinzufüge, um sicherzustellen, dass es als Text behandelt wird):Von dort aus können Sie in jeder
.gitattributes
Datei Folgendes angeben :Beachten Sie auch, dass Sie weiterhin in der Lage sein sollten,
diff
eine Datei zu erstellen, auch wenngit
Sie der Meinung sind , dass sie binär ist mit: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: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:
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).
quelle
Die Lösung besteht darin, durch zu filtern
cmd.exe /c "type %1"
. Dietype
integrierte Konvertierung von cmd führt die Konvertierung durch. Daher können Sie diese mit der Textkonv-Funktion von git diff verwenden, um die Textdifferenzierung von UTF-16-Dateien zu aktivieren (sollte auch mit UTF-8 funktionieren, obwohl nicht getestet).Zitat aus der Manpage von gitattributes:
Durchführen von Textunterschieden von Binärdateien
Manchmal ist es wünschenswert, den Unterschied einer textkonvertierten Version einiger Binärdateien zu sehen. Beispielsweise kann ein Textverarbeitungsdokument in eine ASCII-Textdarstellung konvertiert und der Unterschied des Textes angezeigt werden. Obwohl diese Konvertierung einige Informationen verliert, ist das resultierende Diff für die menschliche Betrachtung nützlich (kann jedoch nicht direkt angewendet werden).
Mit der Option textconv config wird ein Programm zum Durchführen einer solchen Konvertierung definiert. Das Programm sollte ein einzelnes Argument verwenden, den Namen einer zu konvertierenden Datei, und den resultierenden Text auf stdout erzeugen.
Fügen Sie Ihrer
$GIT_DIR/config
Datei (oder$HOME/.gitconfig
Datei) den folgenden Abschnitt hinzu, um beispielsweise den Unterschied der Exif-Informationen einer Datei anstelle der Binärinformationen anzuzeigen (vorausgesetzt, Sie haben das Exif-Tool installiert ):Als Lösung für mingw32 müssen Cygwin-Fans möglicherweise den Ansatz ändern. Das Problem besteht darin, den Dateinamen für die Konvertierung in cmd.exe zu übergeben. Dabei werden Schrägstriche verwendet, und cmd geht von Backslash-Verzeichnis-Trennzeichen aus.
Schritt 1:
Erstellen Sie das Skript mit einem Argument, das die Konvertierung in stdout durchführt. c: \ path \ to \ some \ script.sh:
Schritt 2:
Richten Sie git so ein, dass die Skriptdatei verwendet werden kann. Fügen Sie in Ihre Git-Konfiguration (
~/.gitconfig
oder.git/config
oder sieheman git-config
) Folgendes ein:Schritt 3:
Weisen Sie auf Dateien hin, auf die diese Problemumgehung angewendet werden soll, indem Sie .gitattributes-Dateien verwenden (siehe man gitattributes (5)):
Verwenden
git diff
Sie dann für Ihre Dateien.quelle
cmd //c type "${1//\//\\}"
.textconv = powershell -NoProfile -Command \"& {Get-Content \\$args[0]}\"
Git hat vor kurzem begonnen, Codierungen wie utf16 zu verstehen. Siehe gitattributes docs, suchen nach
working-tree-encoding
[Stellen Sie sicher, dass Ihre Manpage übereinstimmt, da dies ziemlich neu ist!]
Wenn (sagen wir) die Datei UTF-16 ohne Stückliste auf einem Windows-Computer ist, fügen Sie sie Ihrer
.gitattributes
Datei hinzuWenn UTF-16 (mit bom) auf * nix es macht:
(Ersetzen Sie
*.vmc
durch*.whatever
fürwhatever
Typdateien, die Sie verarbeiten müssen)Siehe: Unterstützung der Arbeitsbaumcodierung "UTF-16LE-BOM" .
quelle
*.vmc diff working-tree-encoding=UTF-16LE-BOM eol=CRLF
text
alleine, du hast keine schönen Textunterschiede bekommen? Können Sie das bitte mit beiden überprüfentext
unddiff
alles funktioniert gut? In diesem Fall werde ich eine andere Empfehlungtext
allein führt zu einem binären Vergleich. Ich kanndiff
odertext diff
und es funktioniert. Ich musste-BOM
einfach hinzufügen , weil meine Datei eine Stückliste, YMMV, hatte.Ich habe einen kleinen Git-Diff-Treiber geschrieben,
to-utf8
der es einfach machen soll, nicht ASCII / UTF-8-codierte Dateien zu unterscheiden. Sie können es mithilfe der folgenden Anweisungen installieren: https://github.com/chaitanyagupta/gitutils#to-utf8 (theto-utf8
Skript ist im selben Repo verfügbar).Beachten Sie, dass für dieses Skript sowohl
file
als auchiconv
Befehle auf dem System verfügbar sein müssen.quelle
Hatte dieses Problem kürzlich unter Windows und die
dos2unix
undunix2dos
Bins, die mit Git für Windows geliefert werden, haben den Trick gemacht. Standardmäßig befinden sie sich inC:\Program Files\Git\usr\bin\
. Beachten Sie, dass dies nur funktioniert, wenn Ihre Datei nicht UTF-16 sein muss. Zum Beispiel hat jemand versehentlich eine Python-Datei als UTF-16 codiert, wenn dies nicht erforderlich war (in meinem Fall).und
quelle