Vim
Git
msysGit

Git for Windows で日本語を使いたい

More than 2 years have passed since last update.

追記(2.x): Git for Windows は2015年8月にリリースされた 2.5.0 以降日本語まわりの問題もいくつか改善されているので追記しました。
2.x 系では開発ベースも変わり、もはや msysgit ではなくなったので、本稿のタイトルも変更させていただきます。

"Git for Windows"(いわゆる Git Bash)は Windows 上で git 利用を可能とする bash シェル環境だ。
Gitが使えるだけでなく、オールインワンで基本的なコマンドを備え、 ssh, perl, curl などのツールも入っていて、cygwin なんかに比べお手軽かつお得な環境だ。

筆者の周りでは "Git Bash" で通用している。

かつては日本語を扱うのが面倒であったが、1.8.3 から Bash 上で日本語入力できるようになるなど、最近の状況はだいぶよくなっている。

$ git commit -m '日本語OK'
$ git log -1
Author: kumazo <kumazo@localhost.local>
Date:   Mon Jan 13 00:00:00 2014 +0900

    日本語OK

それでもまだいくつか設定変更は必要だ。
すでに日本語周りのノウハウは多くの方が取り上げられているが、新旧の情報が散在し錯綜しているので、現状をまとめる意味でもここにメモしておく。
ここで取り上げるのは以下の設定項目。

  • トウフ化
  • ls で日本語ファイル名
  • vim で日本語コミットメッセージ
  • git 出力の日本語ファイル名
  • Git GUI の diff の文字化け
  • 外部エディタの設定

トウフ化 (2.x 解消済み)

もし、日本語文字がすべて四角い□(トウフ)になってしまったらそれはコンソールのフォント設定の問題だ。

タイトルバーを右クリックー→プロパティ→フォントタブ→フォントで適切な日本語対応フォントになっているか確認する。

ここで、日本語フォントになっていなければ日本語フォントに変更すればよい。
しかし、日本語フォントになっていたとしても、あえて別の日本語フォントに変更する。
変更後は正常に日本語が表示されるようになる。
再度フォント設定を開き、フォントを元に戻してみる。
なぜか元のフォント設定でも正常に日本語が表示される。

そもそも「MS ゴシック」と「ラスターフォント」しか選択肢がなく、両方日本語対応しているはず。
いったんフォント設定を変更することで、それ以降のトウフ化が解消されるようだ。
なぜこうなるのか理由はわからない。
ちなみにフォントサイズを変更しただけでも同様の効果がある。

タイトルバーからの設定は一時的なものだ。
これを保存するには、Git Bash のデスクトップアイコンを右クリックし、同様の手順をふんで設定をしておく。

ls で日本語ファイル名(2.x 設定済み)

ls で UTF-8 ファイル名が ???? になるのは ls 固有の問題らしい。
以下のオプションをつければ日本語ファイル名が表示される。

$ ls  --show-control-chars

いまいち納得がいかないが .bash_profile あたりにエイリアスを定義して、以後気にしないことにする。

alias ls='ls --show-control-chars'

vim で日本語コミットメッセージ

git commit 時にはデフォルトで同梱の vim エディタが起動する。
日本語でコミットメッセージを残すには、環境によって vim の設定が必要になる。

2.x以降
特に設定変更しなくても、そのままで日本語(UTF-8)が使える。
日本語入力に不具合のあった Windows 8 以降の環境でも問題なく使えるようになった。

デフォルトの vim 設定は以下の通り。

encoding=utf-8
termencoding=
fileencoding=
fileencodings=ucs-bom,utf-8,default,latin1

git commit 時には以下のようになる。

encoding=utf-8
termencoding=
fileencoding=utf-8
fileencodings=utf-8

termencodingは空のままでないとかえって入力が壊れるようなので、1.9.x系でtermencodingを設定していたらこれを外しておく。

デフォルトでシフトJIS等のレガシーな日本文字コードは対応していない。
必要なら fileencodings に cp932 や iso-2022-jp、euc-jp を追記する。

~/.vimrc
set fileencodings=ucs-bom,utf-8,cp932,default,latin1

1.9.x(もやは不要ですが参考までに残しておきます)
git 同梱のvimの文字コード関連の初期設定は以下のようになっている。

encoding=cp932
termencoding=
fileencoding=
filesencoding=

この状態で日本語を入力してみて、表示上文字化けしなければ OK。

文字化けするようなら、以下の vim 設定を試す。

:set termencoding=cp932

これで入力時の文字化けはしなくなるはず。

それでも文字化けするのが Windows 8/8.1 。

どうも、Windows 8 環境では 入力したマルチバイト文字の最初の 1バイトしか拾えていないようだ。
これは vim に限らず、Windows 8 以降の CUI アプリ全般でみられる問題らしい。(下リンク参照)
vim 側で対応されなければどうにもならないようなので、Windows 8 環境では当面これまで通り core.editor に外部エディタを設定するしかない。
GUI 版の gvim(KaoriYa版)なら Windows 8/8.1 環境でも問題なく日本語入力できるのでこれをエディタ設定するものありだろう。
外部エディタの設定例は後にまとめたので参考にしてほしい。

さて、メッセージを保存しコミットを完了した後、ログを確認すると正しく日本語が表示されているはずだ。

もし、コミットログでメッセージが文字化けしていたら、保存時の文字コードが UTF-8 になっていなかった可能性が高い。
コミット時の vim 上で以下 fileencoding の設定を確認してほしい。(fenc は fileencoding の短縮形)

:set fenc
  fileencoding=utf-8

Gi Bash 環境では上記のように utf-8 が設定されているはず。
vim 単独ではもともと空だが、コミットメッセージのテンプレートファイルを開いたら UTF-8 に変更されるようになっている(/share/vim/vimrc)。
もし何らかの問題でこれが空だったり別の文字コードになっていたら、保存前に :set fenc=utf-8 すれは取りあえずOKなはず。
常に UTF-8 を強制するには .gitconfig の設定で上書きして置けばよい。

$ git config --global core.editor "vim -c 'set fileencoding=utf-8' "

とはいえコンフリクト時など vim でソース修正をすることもあるだろうから、ファイル用の文字コードも合わせて.vimrcの方で設定しておいたほうがいいだろう。

新規ファイルの場合は fileencoding の文字コードが使われる。

:set fileencoding=utf-8

既存ファイルの場合は fileencodings で自動判別する文字コードとその優先順を指定する。
コミットメッセージのテンプレートのようにASCIIしかなければ自動判別は役に立たない。 
utf-8 を先頭にしておけば、日本語がなくても UTF-8 とみなされる。

:set fileencodings=utf-8,cp932

これらをまとめて $HOME/_vimrc に保存しておく。

_vimrc
set encoding=cp932
set termencoding=cp932
set fileencoding=utf-8
set fileencodings=utf-8,cp932

Windows では .vimrc ではなく _vimrc が正しい。
_vimrc にしておけばトラブルがなく確実なようだ。

git 出力の日本語ファイル名

git statusgit loggit diff などの出力で表示される日本語ファイル名は "\nnn" にエスケープされてしまって読めない。
以下の設定を追加することで日本語ファイル名が表示されるようになる。

$ git config --global core.quotepath false

シェルスクリプトなどで git の設定に影響を受けたくなければ、printf/bin/echo -e を通すのが簡便な方法だ。

$ printf "$(git log --name-status)"

Git GUI の diff の文字化け

git-gui や gitk で diff 表示が文字化けしたら、ソースファイルの文字コードに合わせて設定変更する。
デフォルトはcp932(SJIS)。

$ git config --global gui.encoding utf-8

外部エディタの設定

Windows用の外部エディタをコミットログに使用するには、エディタの起動オプションを調べておく必要がある。
保存時の文字コードを UTF-8 に指定するほか、git がエディタプロセスの終了を待てるように、タブウィンドウや子プロセスを使わないようにするためだ。

日本でメジャーなエディタのgit configをコピペ用にまとめた。

Editor git config --global core.editor
Sublime Text 3 "'C:/Program Files/Sublime Text 3/subl.exe' --new-window --wait " > Build 3065
Sublime Text 2 "'C:/Program Files/Sublime Text 2/sublime_text.exe' --wait "
GVim (KaoriYa版) "'C:/vim74-kaoriya-win64/gvim.exe' --nofork -c 'set fenc=utf-8' +1 " ZIP
EmEditor ver.14 "'C:/Program Files/EmEditor/EmEditor.exe' //sp //cp 65001 " 64 ビット版
秀丸エディタ ver.8 "'C:/Program Files (x86)/Hidemaru/Hidemaru.exe' //fu8 "
サクラエディタ ver.2 "'C:/Program Files (x86)/sakura/sakura.exe' -CODE=4 "
TeraPad "'C:/Program Files (x86)/TeraPad/TeraPad.exe' //cu8 "
WZ EDITOR 8 "'C:/Program Files (x86)/WZ EDITOR 8/wzeditor.exe' //sdi //new "

基本的にエディタをフルパス名で指定する必要がある。

パスの途中にスペースが入るため、エディタのフルパス名をシングルクオートで囲っておく必要があるので注意。
パスの区切り文字は/でよいが、オプションの / は2重//にしてエスケープする。
ドライブ文字の C:/ が気持ち悪ければ、 /c/ としてもよい。
ただし、git confgコマンドから設定する場合、/c/ を使うとなぜかオプションが削られるので、ハマりたくなければC:/にするか、.gitconfig を直接編集するようにする。

ところで、コミットメッセージだけでなくプロジェクトのソースファイルもいつものエディタで編集したいだろうか。

ソースファイルの拡張子がそれ用のエディタに関連付けられていることがわかっているなら、PATH が通ってなくても start 一発で起動できる。
/bin/start は DOS の start コマンドのラッパースクリプトだ。

$ start hello.c

ただし、うかつに実行すると思わぬ動作をする可能性もある。
たとえば .c拡張子で VisualStudio のような重厚 IDE を召喚してしまうなんてのはマシなほうで、.js拡張子の JavaScript ファイルを開くつもりが WSH で実行されてしまうこともあり得る。

$ echo 'WScript.Echo("Hello")' > hello.js
$ start hello.js      # WSH で実行 ?

ちなみに start にディレクトリを指定するとエクスプローラが開く。
素早くカレントディレクトリを開きたければ start . と打てばよい。

$ start .      # カレントディレクトリをExplorerで開く
$ start ~      # ホームディレクトリ(C:\Users\Taro)を開く

ついでに言えば、URL を与えて Web ブラウザを立ち上げることもできる。

追記
メモ帳(notebad.exe)のラッパー(/usr/bin/notepad)が用意されていてメモ帳を起動できる。

$ notepad test.txt

これはメモ帳の終了を待てるのでコミット用エディタに指定することができる。

$ git config --global core.editor notepad

ただし、残念ながら日本語を使うとエラーになる。

Git for Windows 2.x について

Git のバージョンアップは速いのだが、msysgit は Git-1.9.5-preview20150319.exe で長らく停滞していた。実はその裏で別のプロジェクトに移行して開発が進められていて、2.5.0 からようやく正式版が公開された。

もともと、mysygit は MSys をカスタマイズして実現していたが MinGW/MSys ベースではいろいろ限界があったようで、2.x では Mingw-w64/MSys2 ベースに乗り換え、ターミナルもMinTTY が選択できるようになった。

といかにも知った風だがその辺の事情に疎いので、何がどうなったのか実はさっぱりわからない。個人的に確認できた改善点として

  • Windows 8 以降の環境でも vim の日本語入力ができるようになった。
    ただそれは、vim 開発陣のおかげ。vim ではだいぶ前から対応済みだったが、Git Bash がようやく取り込んだ。

  • Windows 7 64bit 環境上で操作がなぜか異常に重くなる(ls だけで10秒かかる)というぐぬぬな経験をしてたのだが、同じ環境上に 2.x をインストールしたところ解消していることを確認できた。

MSys2 なら tmux や tig が使えてかなりうれしいはずだが、 Git for Windows には入っていない。

Git for Windows には SDK もあって、そちらの方をインストールすれば、MSys2 のパッケージマネージャが使えるので試せるはず。

しかし、なぜか自分の環境ではインストールエラーとなり、調べると次のリリース(Git for Windows SDK 1.0.2)を待てとの由。

参考