8

友人と私は同時に同じ .cs ファイルで作業していましたが、マージの競合がある場合、git は競合があることを指摘しますが、ファイルは通常の "HEAD" ">>>" で読み込まれません。バイナリファイルでした。そのため、.gitattributes ファイルにさまざまなもの (*.cs テキストなど) を追加して、git がそれを機能しないテキスト ファイルとして扱うようにしました。

そのとき、git は他の .cs ファイルを比較できるが、このファイルだけを比較できないことに気付きました。その理由は、いくつかの漢字が含まれているため、Unicode エンコーディングであるためです。

では、git diff を作成したり、utf-16 または utf-8 形式のファイルをマージするにはどうすればよいでしょうか?

腹立たしいことは、プッシュすると、gitlab が正確に何が違うかを示すことです。したがって、gitがサーバー上でどのように差分をとることができるかわかりませんが、bashではできません。

4

1 に答える 1

4

私は C++ プロジェクトの *.rc ファイルで同様の問題を抱えていましたが、これを解決する最善の方法は、git のスマッジ フィルターとクリーン フィルターを使用してリポジトリ内のすべてを utf-8 として保存し、書き込み時に utf-16 に変換することであることがわかりました。作業ディレクトリに。

このように、差分、マージなど、git が行うすべてのことは問題なく utf8 テキストで機能しますが、作業コピーには utf16 が含まれるため、Visual Studio は快適に保つことができます。

これを設定するには、iconv が利用可能なバージョンの git を使用していることを確認し (最新バージョンの msysgit がそうです)、以下を ~/.gitconfig ファイルに追加します。

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

次に、.gitattributes ファイルに以下を追加します。

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

バイナリとして保存されている utf16 の既存のファイルが既にある場合は、それらをリポジトリから削除して、再度追加する必要があります。

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"

そして今、すべてがうまくいくはずです。

于 2014-03-10T06:05:59.843 に答える