git diff, git log で文字化け発生の対応策

git

さくらのレンタルサーバーにいろいろとハマっている。
今回は、git log, git diff で文字化けのような表示になることを解決しなければならない。

git では何のページャーが使われているのだろうか。
どうも環境変数 PAGER に設定されたものが使われるらしい。

さくらのレンタルサーバーで setenv と打ち込むと、PAGER=more と出る。
でも、more が less と挙動が似ているなと調べてみると

[sysfrontier@www894 cooking]$ ls -il /usr/bin/less /usr/bin/more
401488 -r-xr-xr-x 2 root wheel 147624 Dec 4 2012 /usr/bin/less
401488 -r-xr-xr-x 2 root wheel 147624 Dec 4 2012 /usr/bin/more

のように、二つのコマンドは同じiノード番号を持つことが分かる。
つまり同じファイルを指している、ハードリンクされているという意味だ。
だから、less の設定を行えば、more の挙動も同じように変わるはずである。

さて、あるプロジェクトの修正の差分は、以下のように表示される(エスケープシーケンスがそのまま表示され、日本語表示が文字化けする)。

スクリーンショット 2014-12-28 20.56.27

ここで ESC[1m などの文字列はエスケープシーケンスといい、コンソール上でカーソルの位置を移動したり、文字色を変えたりという役割のために使われる。
たとえば、ESC[1m は強調を表し、ESC[36m は水色を表すようだ(カラーエスケープシーケンスという)。
Windows の DOS 窓では通常はエスケープシーケンスは解釈されずそのまま表示されてしまうが、設定ファイル等を変えれば色表示などに対応できるようになるらしい。
さくらのレンタルサーバーで使われている FreeBSD の csh は通常は白黒表示にしか対応していないらしい。
ページャーのせいなのか、シェルのせいなのか、切り分けが必要そうだ。

まずは、git のデフォルトのページャーである less が文字化けしないように、環境変数を ~/.cshrc に追加する。

setenv LESSCHARSET utf-8

これにより UTF-8 の日本語部分は正常に表示されるようになった。
しかし、カラーエスケープシーケンスはまだそのまま表示されてしまう。
-R というオプションが制御文字をキャレットを使って表示するオプションらしい。

setenv LESS “-r”

これを実行したが、まだ直らず…
結局、途方に暮れた結果、git のページャーを明示的に指定する方法を試してみた。

git config –global core.pager less

これで見事に表示されるようになった。

スクリーンショット 2014-12-28 20.50.07

コメント

タイトルとURLをコピーしました