3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

git diffしたら変な文字がでてきて困ったのでなんとかしたい

Last updated at Posted at 2020-06-06

困っていること

git diff

その結果がこちら。
色々な事情あって一部分だけです。
カラー.png
とか
スクリーンショット 2020-05-26 11.37.45.png

この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と表示されてしまう現象は解消されます。

妥協策ですが、これで改行コードが記号化されて表示されることがなくなり、完成。

文字エンコーディングや制御コード類、特に改行コードは忘れられ/見落とされがちだと思いますが、正しく設定しておきましょう。

起きた後の対処も大事ですが、何よりも変な/意図しない差分を生まないことが一番大事。

3
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?