読者です 読者をやめる 読者になる 読者になる

よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

gitでカラー表示で文字化けが発生する場合はlvを削除せよ

gitの設定(~/.gitconfig)で git diff を実行した際に自動的にカラー表示をしてくれるような設定ができます。

[color]
interactive=auto
diff=auto
status=auto
branch=auto
[core]
editor = vim

私のUbuntu環境ではカラー表示の設定をすると、本来カラー表示される部分が"^[[1m"や"^[[m"が表示され、カラー表示がうまくできませんでした。

$ git diff
・・・
^[[1mdiff --git a/app/controllers/portal_controller.rb b/app/controllers/portal_controller.rb^[[m
^[[1mindex 8c327ea..d0f4883 100644^[[m
^[[1m--- a/app/controllers/portal_controller.rb^[[m
^[[1m+++ b/app/controllers/portal_controller.rb^[[m
^[[36m@@ -25,7 +25,13 @@^[[m ^[[mclass PortalController < ApplicationController^[[m
^[[m
# ユーザ登録の画面表示(ウィザード形式のため sessionの中により表示先切替)^[[m
def index^[[m
^[[32m+^[[m^[[32m if SkipEmbedded::InitialSettings['confirm_account_exchange']^[[m
^[[32m+^[[m^[[32m session[:entrance_next_action] ||= :confirm_account_exchange^[[m
^[[32m+^[[m^[[32m end^[[m
^[[32m+^[[m
case session[:entrance_next_action] ||= :confirm^[[m
・・・

なので、gitのdiff=autoの設定を無効化し、colordiffを使って以下のように無理やり対処することで、カラー表示を実現していました。

alias git-diff='git diff | colordiff | more'

上記の方法で対処することはできますが、lv がインストールされているなら、それを削除することで解決するはずです。

そもそも lv とは、以下のようなパッケージです。

lv is a powerful file viewer like less. lv can decode and encode multilingual streams through many coding systems: ISO-8859, ISO-2022, EUC, SJIS, Big5, HZ, Unicode.

It recognizes multi-bytes patterns as regular expressions, lv also provides multilingual grep. In addition, lv can recognize ANSI escape sequences for text decoration.

まずは lv がインストールされているかを確認します。

$ sudo dpkg -l | grep lv
・・・
ii lv 4.51-2 Powerful Multilingual File Viewer
・・・

私の環境では version 4.51-2 がインストールされていました。
なので、パッケージを削除します。

$ sudo apt-get remove lv

パッケージ削除後に git diff などで差分をカラー表示すると、"^[[1m"や"^[[m"の文字化けが解消されます。

【追記】
lv を削除しなくても、環境変数にGIT_PAGERを設定することで文字化けを解消することをid:thinca さんがコメントにて教えてくださいました。
ありがとうございます!
以下のコマンドを実行すれば解決です。

$ export GIT_PAGER="lv -c"

毎回ログインしてexportコマンドを実行するのが面倒なら、ログインシェルで実行されるスクリプト(~/.bashrc や ~/.zshrc など)に追記しておきましょう。