2012-02-12

git-encwrapper更新

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

「 fatal: cannot handle encwrapper internally 」というエラーが出るのでgit-encwrapperを修正しました。

原因はどうやらexecvp(git_filename, argv)にあったようです。git_filenameがgitなのに対してargv<sup><a id="fnr.1" name="fnr.1" class="footref" href="#fn.1">1</a></sup>がgit-encwrapperであるとこのようなメッセージがexecvp呼び出し後のどこかで発生するようです。

ただし、execvpの呼び出し先がmsysgitの場合はこの問題は発生しませんでした。Cygwinのgitだと発生するようです。私はmsysgitを使っているのでこの問題に長らく気がつきませんでした。

なぜ気がついたかというと、Cygwinのgettext-devlパッケージがgitに依存するようになって、Cygwinのgitが自動的にインストールされてしまったからです。

さらにmsysgitとCygwinを連携させるために、ある種のトリックを使っていたことも問題をややこしくしました。msysgitのbinにパスを通すとmsysgit付属の各種UNIXコマンドにもパスが通ってしまって困ります。なので、msysgitにはパスを通さずにC:Program Files (x86)Gitbingit.exeを実行するだけの代理の実行ファイルを/usr/local/bin/git.exeとして配置していたのです(ちなみにハードリンクではexeと同じディレクトリにdllが無いのでうまくいきませんでした。dllも含めて/usr/local/binへ入れればうまくいったかもしれませんけど……)。そしてCygwinのbashからgitを実行したときはPATH=に先に/usr/loca/binが入っていたのでmsysgitが呼ばれ、NTEmacsから実行したときはPATH=に先に/usr/binが入っていたのでCygwinのgitが呼ばれるという無茶苦茶な状況に。なぜEmacs上からだけ動かないんだ!?と原因究明に手間取ってしまいました。結局Windowsの環境変数PATHの順番を調整することでなんとかなりました。

本当はCygwinのgitが使いたいのですが、Cygwinのgitはテキストマウントに対応していません。テキストマウントしたディレクトリにリポジトリを作ると、リポジトリ内の改行コードがcrlfになってしまい、fatalエラーで何も操作できなくなります。

Footnotes:

1

DEFINITION NOT FOUND.