MinGW64 環境の Git で文字化けを解消する


はじめに

MinGW (64bit) + MSYS 環境の構築 (1) | DeVlog – 銀の翼で翔べ – で、Git の入った MinGW 環境を作る方法について記述しました。その後色々と作業しているうちに、ソースに日本語が使われていると git log や git diff が文字化けしてしまう事がわかりました。本記事では、この問題の原因と解決方法について紹介します。

文字化けの原因

Windows のコマンドプロンプトは、SJIS で表示するようになっています。一方、MSYS の各種ツールは UTF-8 で表示するようになっています。この違いにより文字化けが発生するようです。ちなみに、コミット後に表示されるログは文字化けしませんでした。どうやら、Git の各種コマンドのうちページャを使って表示するものが文字化けするようです。

解決方法

文字化けを解決するには、Git がページャ表示する際に nkf を通して表示するように設定すると良さそうです。以下、その手順です。

  1. nkf のインストール
    1. http://sourceforge.jp/projects/nkf/ からソースをダウンロードして展開
    2. Makefile の CC = cc を CC = gcc に変更
    3. 以下のコマンドでビルドしてインストール
  2. ~/.bashrc に以下を記述

以上の設定後、msys.bat でコマンドプロンプトを起動すれば、文字化けしない Git が使えるようになっています。

[関連記事]

  1. MinGW (64bit) + MSYS 環境の構築 (1) | DeVlog – 銀の翼で翔べ –
  2. MinGW (64bit) + MSYS 環境の構築 (2) | DeVlog – 銀の翼で翔べ –

[参考サイト]
WindowsでのGit環境構築とその注意点 3ページ | SourceForge.JP Magazine

MinGW+MSYS と msysgit を連携させる


はじめに

MinGW+MSYS 環境から Git を使えるよう試行錯誤し、満足のいく結果が得られたのでご紹介します。
terminal2

最初、msysgit の開発者用環境をインストールしてその MSYS 環境を使うことも考えました。しかし、この MSYS 環境はあくまで Git を運用するためにパッチをあてたものです。実際、一部のツールはバージョンが古かったりします。

一方、純粋な MinGW+MSYS に Git をインストールしようとしても mingw-get では Git をインストールできません。msysgit があえて独自の MSYS 環境と共に配布されている事実を考えれば、通常の MSYS 環境で Git をビルドするのも容易でないことが想像できます。そのため、Git を使うには msysgit の Git Bash を別途起動する必要があります。しかし、MinGW+MSYS を開発環境として使うのであれば、(Git Bash を開くのでなく) 直接 MinGW Shell から Git を利用できることが望ましいです。

これらの事から、MSYS 環境としては MinGW+MSYS を純粋にインストールし、そこから msysgit の Git を利用できるようにすることを考えました。msysgit の MSYS は、単に Git の一部と割り切ることにしました。ただし、MSYS は各種ツールを含むため、Windows 上でむやみにパスを通すと他のツールに干渉することが考えられます。そこで、できるだけ MinGW Shell 内に限定してパスが有効になるような設定を行いました。

※2013/12/23 この記事の後、Git の入った MSYS バイナリを見つけました。ここで紹介する方法より、そちらの方がベストだと思っています。導入は、こちらの記事を参照してください。

基本方針

基本方針は以下の通りです。

  1. MinGW+MSYS と msysgit を各々独立してインストールする。(それぞれを単独で利用できる)
  2. MinGW+MSYS の環境から Git を使えるようにする。(msysgit の Git Bash から MinGW+MSYS のツールが使える必要は無い)
  3. Windows のグローバルな環境変数は極力さわらない。MinGW Shell 内に限定した環境を作る。
  4. git だけでなく、gitk も使えるようにする

MinGW と msysgit のインストール

まず、MinGW+MSYS と msysgit をそれぞれインストールします。注意点は、インストール先がスペースを含まないディレクトリ名の階層になるようにすることです。パスを参照する際にスペースが含まれていると、問題が発生する可能性があるためです。特に msysgit はデフォルトで Program Files にインストールされてしまうので、すでにインストール済であれば再インストールした方が良いでしょう。ここでは、MinGW を c:MinGW に、msysgit を c:Git にインストールしました。

MinGW から Git が使えるようにする

MinGW から Git を使うには、MinGW 環境内で msysgit へのパスを通します。

まず、MinGW (MSYS) にログインした時のシェルを Bash にします。ホームディレクトリ (この例では、C:MinGWmsys1.0homeユーザ名) に、以下の内容で .profile を作成します。

次に、ホームディレクトリに .bashrc を配置して msysgit にパスを通します。この時、ついでにブランチを表示するようにプロンプトも設定しておくと便利です。

1行目で Git のディレクトリ (c:Gitbin) にパスを通しています。msysgit 環境は Git のための限定した使用にとどめたいので、他のパスより後に設定しておきます。また、3行目がプロンプトの設定です。ここで使用している __git_ps1 の定義を取得するために 2 行目で git-promt.sh (msysgit に付属しています) を読み込んでいます。プロンプトの形式は好みで修正してください。

最後に .gitconfig を配置します。(あるいは git config –global コマンドで各種設定をします。) 既に msysgit で設定済の場合は、Windows のホームディレクトリ (C:Usersユーザ名 等) からコピーしてくると良いと思います。ただし、オープンソースのビルドでは CRLF の改行が問題を起こすことが多いので、autocrlf の設定は false にしておく方が無難です。ターミナルから以下を実行しておきます。

以上で、MinGW Shell (msys.bat) から git や gitk を使うことができるようになります。

[関連記事]
MinGW (64bit) + MSYS 環境の構築 (1) | DeVlog – 銀の翼で翔べ –

コマンドラインから git-gui/gitk を呼び出す


基本的にはコマンドラインで操作することの多い Git ですが、履歴のツリーを確認したり、複数ファイルの変更状況を確認する時等は、GUI の方が便利です。この記事では、標準の GUI ツールである git-gui と gitk について、コマンドラインからの呼び出し方法について紹介します。また、GUI とコマンドラインを併用する呼び出し方法についても触れます。

Git 標準の GUI ツール

Git には、標準で GUI ツールが用意されています。(別途インストールが必要な場合もあります。Ubuntu では、sudo apt-get install git-gui を実行します。)

gitk で履歴のツリーを確認できます。各コミットを選択するとその内容や差分が表示されます。
gitk_compressed

git-gui は、少し癖がありますが、git の操作を GUI で行うことができます。また、git-gui から gitk を呼び出すこともできます。
git-gui

Windows で msysgit を使っている場合は、エクスプローラのコンテキストメニューから git-gui を呼び出すことができます。
context-menu

コマンドラインからの GUI ツール呼び出し

msysgit でも純粋な Linux 環境でも、コマンドラインからこれらを呼び出すことができます。

gitk は、デフォルトではカレントブランチの履歴を表示します。–all を付けるとすべての履歴を表示します。 git-gui は、git のサブコマンドとして呼び出します。

実際に上記のコマンドを実行してみると、確かに GUI ツールは起動するのですが、GUI ツールを終了するまではコマンドラインに戻って来ません。コマンドラインで作業をするには、別のターミナルを開く必要があります。

GUI ツールをバックグラウンドで実行する

GUI を開いておいて、なおかつコマンドラインで作業を進めたい時は、以下のように GUI をバックグラウンドで実行すると良いです。

Unix 系 OS ではコマンドの後に “&” を付けることで、コマンドをバックグラウンドで実行できます。msysgit の bash 上でもこの方法は有効です。また、このようにして開いた GUI ツールは、ターミナルを閉じると全て一緒に終了するのでとても便利です。