web-dev-qa-db-ja.com

gitにUTF-16ファイルをテキストとして認識させることはできますか?

私はgitでVirtual PC仮想マシンファイル(* .vmc)を追跡していますが、変更を行った後、gitはファイルをバイナリとして識別し、差分を表示しません。ファイルがUTF-16でエンコードされていることを発見しました。

このファイルがテキストであることを認識して適切に処理するようにgitに教えることはできますか?

Core.autocrlfをfalseに設定して、Cygwinでgitを使用しています。必要に応じて、UNIXでmSysGitまたはgitを使用できます。

130
skiphoppy

私はしばらくの間この問題に苦労してきましたが、(私にとって)完璧な解決策を発見しました:

$ git config --global diff.tool vimdiff      # or merge.tool to get merging too!
$ git difftool commit1 commit2

git difftoolgit diffと同じ引数を取りますが、組み込みのGNU diff]ではなく、選択したdiffプログラムを実行します。マルチバイト対応のdiff(私の場合、diffモードでvim)とgit difftoolの代わりにgit diffを使用します。

入力するには「difftool」が長すぎますか?問題ない:

$ git config --global alias.dt difftool
$ git dt commit1 commit2

ギットロック。

77
Sam Stokes

Unicesですぐに使用できる非常にシンプルなソリューションがあります。

たとえば、Appleの.stringsファイルの場合:

  1. リポジトリのルートに.gitattributesファイルを作成します:

    *.strings diff=localizablestrings
    
  2. ~/.gitconfigファイルに次を追加します。

    [diff "localizablestrings"]
    textconv = "iconv -f utf-16 -t utf-8"
    

ソース: Gitの異なる.stringsファイル (および 以前の投稿 2010年から)。

60
IlDan

.gitattributesをテキストファイルとして扱うように設定しようとしましたか?

例えば。:

*.vmc diff

詳細については http://www.git-scm.com/docs/gitattributes.html をご覧ください。

37
Chealion

デフォルトでは、gitはUTF-16ではうまく機能しないようです。このようなファイルでは、CRLF処理が行われていないことを確認する必要がありますが、diffおよびmergeを通常のテキストファイルとして機能させる必要があります(これは、端末/エディターはUTF-16を処理できます)。

しかし .gitattributes manpage を見ると、binaryであるカスタム属性があります:

[attr]binary -diff -crlf

したがって、トップレベルでカスタム属性を定義できるように思えます.gitattributes for utf16(マージをここで追加して、テキストとして扱われることを確認してください):

[attr]utf16 diff merge -crlf

そこから、次のような.gitattributesファイルで指定できます。

*.vmc utf16

また、たとえdiffがバイナリであると考えていても、 git を実行できる必要があることに注意してください。

git diff --text

編集

この答え 基本的に、UTF-16またはUTF-8でさえGNU diffはうまく機能しないと言っています。 gitに(--ext-diffを介して)違いを確認するために別のツールを使用したい場合、その答えは Guiffy を示唆しています。

しかし、おそらく必要なのは、ASCII文字のみを含むdiff UTF-16ファイルだけです。これを機能させる方法は、--ext-diffと次のシェルスクリプトを使用することです。

#!/bin/bash
diff <(iconv -f utf-16 -t utf-8 "$1") <(iconv -f utf-16 -t utf-8 "$2")

UTF-8への変換はマージでも機能する可能性があることに注意してください。両方向で行われることを確認する必要があります。

UTF-16ファイルのdiffを見るときの端末への出力に関して:

そのように差分しようとすると、バイナリガベージが画面に表示されます。 gitがGNU diffを使用している場合、GNU diffはユニコード対応ではないようです。

GNU diffは実際にはUnicodeを気にしないので、diff --textを使用すると、単にdiffを実行してテキストを出力します。問題は、使用している端末が(ASCII文字であるdiffマークと組み合わせて)発行されたUTF-16を処理できないことです。

29
Jared Oberhaus

解決策は、cmd.exe /c "type %1"でフィルタリングすることです。 cmdのtypeビルトインは変換を行うため、これをgit diffのtextconv機能で使用して、UTF-16ファイルのテキストdiffingを有効にすることができます(テストされていませんが、UTF-8でも動作するはずです)。

Gitattributesのマニュアルページから引用:


バイナリファイルのテキスト差分の実行

一部のバイナリファイルのテキスト変換バージョンの差分を確認することが望ましい場合があります。たとえば、ワープロ文書をASCIIテキスト表現に変換し、テキストの差分を表示できます。この変換により情報が失われますが、結果の差分は人間が見るのに役立ちます(直接適用することはできません)。

Textconv configオプションは、このような変換を実行するためのプログラムを定義するために使用されます。プログラムは、単一の引数、変換するファイルの名前を取り、結果のテキストを標準出力に生成する必要があります。

たとえば、バイナリ情報ではなくファイルのexif情報の差分を表示するには(exifツールがインストールされていると仮定して)、次のセクションを$GIT_DIR/configファイル(または$HOME/.gitconfigファイル)に追加します:

[diff "jpg"]
        textconv = exif

Mingw32のソリューション、cygwinファンはアプローチを変更する必要があります。問題は、cmd.exeに変換するファイル名を渡すことにあります-スラッシュを使用し、cmdはバックスラッシュのディレクトリ区切り文字を想定しています。

ステップ1:

Stdoutへの変換を行う単一引数スクリプトを作成します。 c:\ path\to\some\script.sh:

#!/bin/bash
SED='s/\//\\\\\\\\/g'
FILE=\`echo $1 | sed -e "$SED"\`
cmd.exe /c "type $FILE"

ステップ2:

スクリプトファイルを使用できるようにgitをセットアップします。 git config(~/.gitconfigまたは.git/configまたはman git-configを参照)内に、これを置きます:

[diff "cmdtype"]
textconv = c:/path/to/some/script.sh

ステップ3:

.gitattributesファイルを使用して、このワークアロンドを適用するファイルを指定します(man gitattributes(5)を参照)。

*vmc diff=cmdtype

次に、ファイルでgit diffを使用します。

8
Tony Kuneck

小さなgit-diffドライバーto-utf8を作成しました。これにより、非ASCII/UTF-8でエンコードされたファイルを簡単に差分できます。こちらの手順に従ってインストールできます: https://github.com/chaitanyagupta/gitutils#to-utf8to-utf8スクリプト同じレポで利用可能です)。

このスクリプトでは、システムでfileコマンドとiconvコマンドの両方が使用可能である必要があります。

4
Chaitanya Gupta

gitは最近、utf16などのエンコーディングを理解し始めました。 gitattributes docsを参照して、working-tree-encoding

[これは非常に新しいので、manページが一致することを確認してください!]

(たとえば)Windowsマシンでファイルがbomなしのutf-16の場合、gitattributesファイルに追加します

*.vmc text working-tree-encoding=UTF-16LE eol=CRLF

* nixのutf-16(bomを使用)で作成する場合

*.vmc text working-tree-encoding=UTF-16 eol=LF
2
Rusi

最近Windowsでこの問題が発生し、dos2unixand unix2dos git for windowsに同梱されているビンがこのトリックを行いました。デフォルトでは、それらはC:\Program Files\Git\usr\bin\これは、ファイルがUTF-16である必要がない場合にのみ機能しますたとえば、誰かが誤ってエンコードした場合python必要のないときにUTF-16としてファイル(私の場合))。

PS C:\Users\xxx> dos2unix my_file.py
dos2unix: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 Unix format...

そして

PS C:\Users\xxx> unix2dos my_file.py
unix2dos: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 DOS format...
1