2010-04-24

エンコーディングを調整するラッパーを使ってMeadow上のMagitで部分的なstage(apply)をする

2013-08-12追記: elisp側で何とかするコードを書きました。複数の文字符号化方式が混在しているときのmagit文字化け対策コード

結局gitのラッパーを書いた。git-encwrapper(GitHubを初めて利用してみた)。

このラッパーは標準入出力を通過するパッチテキストのファイルヘッダーを認識して、ファイル名に対応するgitattributesのencoding属性を取得し、そのエンコーディングを元に、パッチテキストのファイル内容部分を再エンコードする。

このラッパーのおかげで、エンコーディングを統一するためにexternal diffとnkfを使う必要はなくなった。ただ、nkfのように自動でエンコーディングを判定しないので、.gitattributesファイルに「*.txt encoding=utf-8」のように記述しないといけない。

apply時にはdiffの逆変換を行うので、Magitが(エンコーディングが)統一されたdiffの出力を元に部分適用のパッチを作成して(標準入力経由で)gitに送り返してきても、先にラッパーが(エンコーディングが)バラバラの状態に戻すので、gitは正しくパッチを適用することが出来る。

これで、今度こそようやくまともに使えるようになったと思う。マージ操作のやり方とかまだ学んでいないから、また動かないケースに遭遇するかもしれないけど……。

それにしても、何でこんなに苦労しなければならないのかさっぱり分からない。Meadow、Emacs、Windows、Linux、どこで使うにしてもいろいろな文字エンコーディングを柔軟に使いたい場合、素のgitでは使い物にならないと思う。こういう要求ってそれほど特殊なのものだろうか? 誰も気がつかないはず無いんだけど。現にgit-guiではそれなりに対応しているわけだし。git自体にエンコーディングに関する処理を入れたくない方針なのであれば(ログについてはすでに処理してるけどね。それも中途半端に)、git-cui(guiではなく)みたいなフロントエンドが必要なんじゃないんだろうか。私が知らないだけで、すでに何らかの対処がされていてもおかしくないと思う。いや、そうであってほしい。