回答:
私はこの問題にしばらく取り組んでいますが、(私にとって)完璧な解決策を見つけました:
$ 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(私の場合vim
はdiffモード)を選択して、のgit difftool
代わりに使用してくださいgit diff
。
「difftool」が長すぎて入力できませんか?問題ない:
$ git config --global alias.dt difftool
$ git dt commit1 commit2
Git rocks。
Unicesでそのまま使用できる非常にシンプルなソリューションがあります。
たとえば、Appleの.strings
ファイルでは次のようになります。
.gitattributes
リポジトリのルートにファイルを作成します。
*.strings diff=localizablestrings
以下を~/.gitconfig
ファイルに追加します。
[diff "localizablestrings"]
textconv = "iconv -f utf-16 -t utf-8"
出典:GitのDiff .stringsファイル(および2010年以降の古い投稿)。
iconv
は、VimまたはBeyond Compareとまったく同じ方法で「別のツール」です(gitスイートの一部ではありません)。
vimdiff
とiconv
どちらもすでにmacOSに存在しているので、どこで入手するか
.gitattributes
テキストファイルとして扱うように設定しましたか?
例えば:
*.vmc diff
詳細については、http://www.git-scm.com/docs/gitattributes.htmlをご覧ください。
set
とdiff
...
*.vmc diff
、*.sql diff
などが必要です。(私は答えを編集することはできません)。ただし、2つの注意点:diffは各文字の間にスペースを入れて表示され、問題のあるファイルの「ハンクのステージング」または「ハンクの破棄」はできません。
デフォルトでは、git
UTF-16ではうまく機能しないようです。このようなファイルの場合、CRLF
処理が行われていないことを確認する必要がありますがdiff
、merge
、通常のテキストファイルとして機能させるます(これは、ターミナル/エディターがUTF-16を処理できるかどうかを無視しています)。
しかし、.gitattributes
マンページを見ると、次のようなカスタム属性がありbinary
ます。
[attr]binary -diff -crlf
したがって、トップレベル.gitattributes
でカスタム属性を定義できるように思えますutf16
(テキストとして扱われるように、ここにマージを追加していることに注意してください)。
[attr]utf16 diff merge -crlf
そこから、次の.gitattributes
ようなファイルを指定できます。
*.vmc utf16
また、次のようにバイナリであると考えられdiff
ている場合でも、ファイルにアクセスできるはずですgit
。
git diff --text
編集する
この回答は基本的に、GNU diffとUTF-16またはUTF-8でもうまく機能しないことを示しています。git
別のツールを使用して(を介して--ext-diff
)違いを確認したい場合、その答えはGuiffyを示唆しています。
しかし、おそらく必要なのはdiff
、ASCII文字のみを含む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は本当にユニコードを気にしないので、diff --textを使用すると、diffしてテキストを出力します。問題は、使用している端末が(ASCII文字であるdiffマークと組み合わせて)発行されたUTF-16を処理できないことです。
解決策は、でフィルタリングすることcmd.exe /c "type %1"
です。cmdのtype
組み込みが変換を行うので、それをgit diffのtextconv機能で使用して、UTF-16ファイルのテキスト比較を有効にすることができます(テストされていませんが、UTF-8でも機能するはずです)。
gitattributesのmanページからの引用:
一部のバイナリファイルのテキスト変換されたバージョンの差分を確認することが望ましい場合があります。たとえば、ワードプロセッサドキュメントをASCIIテキスト表現に変換し、テキストの差分を表示できます。この変換では一部の情報が失われますが、結果の差分は人間が見るのに役立ちます(ただし、直接適用することはできません)。
textconv構成オプションは、そのような変換を実行するためのプログラムを定義するために使用されます。プログラムは単一の引数、つまり変換するファイルの名前を受け取り、結果のテキストをstdoutに生成します。
たとえば、バイナリ情報の代わりにファイルの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)を参照)を使用して、このworkarondを適用するファイルを指摘します。
*vmc diff=cmdtype
次にgit diff
、ファイルで使用します。
cmd //c type "${1//\//\\}"
。
textconv = powershell -NoProfile -Command \"& {Get-Content \\$args[0]}\"
gitは最近、utf16などのエンコーディングを理解し始めました。gitattributesのドキュメントを参照して検索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-BOM eol=LF
(置き換え*.vmc
を*.whatever
するためにwhatever
あなたがハンドルに必要なタイプのファイル)
参照:サポート作業ツリーエンコーディング "UTF-16LE-BOM"。
@Hackslashに続いて、これは不十分であることがわかるかもしれません
*.vmc text working-tree...
必要なテキストの差分を取得するには
*.vmc diff working-tree...
両方の作品も置く
*.vmc text diff working-tree...
しかし、それは間違いなく
eol=...
意味するtext
Gitにはを意味するマクロ属性が binary
あります-text -diff
。反対+text +diff
は組み込みでは利用できませんが、gitはそれを合成するためのツール(私はそう思います!)を提供します
Gitでは、新しいマクロ属性を定義できます。
私は.gitattributes
あなたが持っているファイルのトップを提案します
[attr]textfile text diff
次に、テキストおよび差分にする必要があるすべてのパスについて
path textfile working-tree-encoding= eol=...
ほとんどの場合、デフォルトのエンコーディング(utf-8)とデフォルトのeol(ネイティブ)が必要であるため、削除される可能性があることに注意してください。
ほとんどの行は次のようになります
textfile *.c
textfile *.py
Etc
実用:ほとんどの場合、ネイティブeolが必要です。いいえを意味しeol=...
ます。そのtext
ため、黙示的ではなく、明示的に配置する必要があります。
概念:テキストとバイナリーが基本的な違いです。eol、encoding、diffなどは、ほんの一部の側面です。
私たちが住んでいる奇妙な時期のため、現在動作しているGitを備えたマシンはありません。そのため、現時点では最新の追加情報を確認できません。誰かが何か問題を見つけた場合、私はエメンド/削除します。
*.vmc diff working-tree-encoding=UTF-16LE-BOM eol=CRLF
text
一人であなたが素晴らしいテキスト差分を得られなかったと言っていると思いますか?あなたがそれをチェックしてくださいすることができ、両方 text
とdiff
すべてが正常に動作しますか?その場合、私は別の推奨事項を行います
text
単独ではバイナリ比較になります。私はできるdiff
かtext diff
、それでうまくいく。-BOM
ファイルにBOM、YMMVが含まれているため、追加する必要がありました。
小さなgit-diffドライバーto-utf8
を作成しました。これにより、ASCII / UTF-8以外でエンコードされたファイルを簡単に比較できます。https://github.com/chaitanyagupta/gitutils#to-utf8の手順を使用してインストールできます(to-utf8
スクリプトは同じリポジトリで入手できます)。
このスクリプトでは、システムでコマンドfile
とiconv
コマンドの両方を使用できる必要があることに注意してください。
最近Windowsでこの問題が発生しました。Windows用のgitに同梱されているdos2unix
とunix2dos
binがうまくいきました。デフォルトでは、これらはにあり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...