困っていること
git diff
このESC[m
や行末の^M
ってなんだ?
ずっと出てて気にしないようにはしてましたが、数が増えてくると邪魔で仕方がない。
解決策
消す方法を探しました。
コメント受けて追記:
改行コードについては本来はそもそも改行コードが途中で変わってしまった状態でcommitすることがおかしいのですが、既に起きてしまっているので、見にくさを軽減できればという方向性の妥協策です。
git config --global core.pager "less -R"
git config --global core.whitespace cr-at-eol
これだけ。
global
なところは自身の状況に合わせてlocal
にしたりしてください。
1つ目は、ANSI Color Escape Sequenceがそのまま表示されているので、これを正しく解釈してカラー表示するため、
2つ目は、CRも改行コードの一部なんだよっていう設定です。
解説
そもそもESC[m
や^M
って何なんだというところからですが、
ESC[m
はANSI Color Escape Sequenceです。[
とm
の間に色コードが入ります。
次に^M
は改行コード、具体的にはCR
(キャリッジリターン)を余分な空白として認識し、それを表現するために出てきているものです。
(CRはgitのデフォルトでは改行コードではなく空白として扱われるため)
ANSI Color Escape Sequenceがあるのは、git diff
がいい感じに色をつけて表示しようとしてくれているからで簡単に納得がいきます。
ところが問題は改行コードです。これはWindows環境とmacやlinux環境では通常扱う改行コードが異なってることに起因します。
そのため、ファイル内の改行コードを見て自動的に改行コードの定義を変えてくれるようなエディタを使っていない場合は
OS既定(場合によってはエディタの設定による)の改行コードが使われてしまい、ファイル内の本来の改行コードとは異なる改行コードが設定される場合があります。
本来改行コードの違いは起きないようにすべきですが、起きてしまっていると冒頭の例のように^M
と意味のわからない文字が表示されてしまいます。
そこで、core.whitespace
の設定を変更し、CR
も改行コードの一部であると定義しておけばCR
が差^M
と表示されてしまう現象は解消されます。
妥協策ですが、これで改行コードが記号化されて表示されることがなくなり、完成。
文字エンコーディングや制御コード類、特に改行コードは忘れられ/見落とされがちだと思いますが、正しく設定しておきましょう。
起きた後の対処も大事ですが、何よりも変な/意図しない差分を生まないことが一番大事。