2013-08-07 1 views
7

Ein Freund und ich arbeiteten an der gleichen .cs-Datei zur gleichen Zeit und wenn es einen Zusammenführungskonflikt git gibt es einen Konflikt, aber die Datei ist nicht geladen die üblichen "HEAD" ">>>" Zeug, weil die .cs-Dateien Binärdateien waren. Also fügten wir zahlreiche Dinge (* .cs Text und so weiter) zu unserer .gitattributes Datei hinzu, damit git es als eine Textdatei behandelt, die nicht funktionierte.Git cant diff oder merge CS-Datei in utf-16-Codierung

Das war, als wir realisierten, dass git andere .cs-Dateien vergleichen konnte und eben nicht diese. Der Grund dafür ist, dass es in der Unicode-Codierung ist, da es einige chinesische Zeichen enthält.

Also, wie machen wir git diff oder merge Dateien, die in utf-16 oder utf-8-Format sind?

Das Furrating Sache ist, dass wenn ich Push, Gitlab zeigt, was genau anders ist. So bekomme ich nicht, wie git diff auf dem Server differieren kann, aber nicht mit bash.

+1

Ich glaube, dass die folgende Frage das gleiche Problem behandelt: http://StackOverflow.com/Questions/777949/Can-i-Make-Git-Recovery-a-utf16-file-as-text –

+0

Ja, Ich habe das versucht. Allerdings zeigt das diff wie folgt an: "@@@@@@@" so ist es nicht viel Hilfe und es wird auch nicht verschmelzen – user1879789

+0

Ein Work-Around könnte sein, ein anderes Diff/Merge-Tool zu verwenden. Hast du das probiert? –

Antwort

4

Ich hatte ein ähnliches Problem mit * .rc-Dateien für ein C++ - Projekt und den besten Weg gefunden, dies zu lösen, ist git's Smudge und saubere Filter zu verwenden, um alles im Repository als utf-8 zu speichern, und dann in utf umzuwandeln -16 beim Schreiben in das Arbeitsverzeichnis.

So wird alles, was git tut, wie Diffs, Merges oder was auch immer, ohne Probleme am utf8-Text arbeiten, aber Ihre Arbeitskopie wird utf16 haben, was Visual Studio glücklich macht.

Um dies zu konfigurieren, stellen Sie sicher, dass Sie eine Version von git verwenden, das (die neuesten Versionen von msysgit tun) iconv zur Verfügung hat, und fügen Sie folgendes zu Ihrer ~/.gitconfig Datei:

[filter "utf16"] 
    clean = iconv -f utf-16le -t utf-8 
    smudge = iconv -f utf-8 -t utf-16le 
    required 

dann in Ihrer .gitattributes-Datei hinzu:

*.rc filter=utf16 
resource.h filter=utf16 

Wenn Sie bereits vorhandene Dateien in utf16 als binär gespeichert haben, dann müssen Sie sie aus dem Repository entfernen und erneut hinzufügen sie.

git rm --cached <names-of-utf16-files> 
git commit -am "removed utf16 files" 
git add <names-of-utf16-files> 
git commit -am "added utf16 files as utf8" 

Und jetzt sollte alles funktionieren.

+3

Seien Sie vorsichtig mit dieser Lösung - .gitconfig ist 100% benutzerabhängig. Ich empfehle es zu * filter * was _you_ sehen und nicht * ändern * was gespeichert ist. Wie in, wenn jemand anderes dies überprüft (oder wenn Sie in einem Jahr oder zwei) ohne. Gitconfig Zeile - * Ihr Code wird nicht kompilieren *. Es ist besser, [diff "utf16"] als Filter zu verwenden, da die .rc * im Repository als UTF-16 gespeichert sein muss. –