私はgitでVirtual PC仮想マシンファイル(* .vmc)を追跡していますが、変更を行った後、gitはファイルをバイナリとして識別し、差分を表示しません。ファイルがUTF-16でエンコードされていることを発見しました。
このファイルがテキストであることを認識して適切に処理するようにgitに教えることはできますか?
Core.autocrlfをfalseに設定して、Cygwinでgitを使用しています。必要に応じて、UNIXでmSysGitまたはgitを使用できます。
私はしばらくの間この問題に苦労してきましたが、(私にとって)完璧な解決策を発見しました:
$ git config --global diff.tool vimdiff # or merge.tool to get merging too!
$ git difftool commit1 commit2
git difftool
はgit diff
と同じ引数を取りますが、組み込みのGNU diff
]ではなく、選択したdiffプログラムを実行します。マルチバイト対応のdiff(私の場合、diffモードでvim
)とgit difftool
の代わりにgit diff
を使用します。
入力するには「difftool」が長すぎますか?問題ない:
$ git config --global alias.dt difftool
$ git dt commit1 commit2
ギットロック。
Unicesですぐに使用できる非常にシンプルなソリューションがあります。
たとえば、Appleの.strings
ファイルの場合:
リポジトリのルートに.gitattributes
ファイルを作成します:
*.strings diff=localizablestrings
~/.gitconfig
ファイルに次を追加します。
[diff "localizablestrings"]
textconv = "iconv -f utf-16 -t utf-8"
ソース: Gitの異なる.stringsファイル (および 以前の投稿 2010年から)。
.gitattributes
をテキストファイルとして扱うように設定しようとしましたか?
例えば。:
*.vmc diff
詳細については http://www.git-scm.com/docs/gitattributes.html をご覧ください。
デフォルトでは、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を処理できないことです。
解決策は、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はバックスラッシュのディレクトリ区切り文字を想定しています。
Stdoutへの変換を行う単一引数スクリプトを作成します。 c:\ path\to\some\script.sh:
#!/bin/bash
SED='s/\//\\\\\\\\/g'
FILE=\`echo $1 | sed -e "$SED"\`
cmd.exe /c "type $FILE"
スクリプトファイルを使用できるようにgitをセットアップします。 git config(~/.gitconfig
または.git/config
またはman git-config
を参照)内に、これを置きます:
[diff "cmdtype"]
textconv = c:/path/to/some/script.sh
.gitattributesファイルを使用して、このワークアロンドを適用するファイルを指定します(man gitattributes(5)を参照)。
*vmc diff=cmdtype
次に、ファイルでgit diff
を使用します。
小さなgit-diffドライバーto-utf8
を作成しました。これにより、非ASCII/UTF-8でエンコードされたファイルを簡単に差分できます。こちらの手順に従ってインストールできます: https://github.com/chaitanyagupta/gitutils#to-utf8 (to-utf8
スクリプト同じレポで利用可能です)。
このスクリプトでは、システムでfile
コマンドとiconv
コマンドの両方が使用可能である必要があります。
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
最近Windowsでこの問題が発生し、dos2unix
and 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...