Vim
Mac
Git

Macでgit commitが失敗する場合の対応

More than 3 years have passed since last update.


検証環境

OS X 10.9.5


状態

コミット時に以下のようなエラーメッセージが出力されコミットに失敗してしまう。

$ git commit

error: There was a problem with the editor 'vi'.
Please supply the message using either -m or -F option.


対応

コミット時のエディタを指定する。

指定する際にはシンボリック・リンクの"vi"ではなく、実体の"vim"を指定する。

$ git config --global core.editor "vim"


補足

今回の障害は、エディタが0以外の終了コードを返すことが原因である。

core.editorが未設定かつ、環境変数EDITORが設定されていない場合、コミット時のエディタとしてviが呼び出される。

追加インストール等をしていない状態ならば、/usr/bin/viは、/usr/bin/vimへのシンボリック・リンクになっている。

gitからの呼び出しではなく直接コマンドにより、vimを起動してファイルを編集した後の終了コードを確認すると、シンボリック・リンク経由で起動した場合のみ、終了コードが1になっている。

$ which {vi,vim}

/usr/bin/vi
/usr/bin/vim

$ ll /usr/bin/{vi,vim}
lrwxr-xr-x 1 root wheel 3 9 29 15:29 /usr/bin/vi@ -> vim
-rwxr-xr-x 1 root wheel 1472736 9 29 15:28 /usr/bin/vim*

$ vi code.rb
$ echo $?
1

$ vim code.rb
$ echo $?
0

シンボリック・リンク経由の起動を回避するため、コミット時のエディタに"vim"を指定する。


追記2(解決)

いつの間にかツイートされてて、さらに答えが出ました。感謝。


「vi」という名前で起動すると、vi互換動作になり、vim限定の命令が無効になってしまうのが原因。


仕様通りの動作で、vi互換になるには他の条件もあるそうです。

これで、別バージョンで同じ状態になっても、しっかり対応できそうです。

さらに「ex」だとラインエディターになるそうです。

現環境で確認したら、しっかりvimでした。

$ ls -l /usr/local/bin/ex

lrwxr-xr-x 1 stupiddog admin 28 11 1 17:49 /usr/local/bin/ex@ -> ../Cellar/vim/7.4.488/bin/ex

$ ls -l /usr/local/Cellar/vim/7.4.488/bin/ex
lrwxr-xr-x 1 stupiddog admin 3 11 1 17:47 /usr/local/Cellar/vim/7.4.488/bin/ex@ -> vim


追記1

もっと発生の原因を特定するために.vimrcの内容を絞り込んだ結果、filetype offが原因であることが分った。

ログ出力を指定して実行した結果、エラーが発生していることが分かる。

$ /usr/bin/vi -V9vi.log code.rb


vi.log

...

Error detected while processing /usr/share/vim/vim73/ftoff.vim:
line 11:
E216: No such group or event: filetypedetect *
...

autocommandで登録されたコマンドを削除するためにau!コマンドを実行しているが、削除対象が無いためエラーとなっている。

試しにfiletype offより前にfiletype onを記述しておくとエラーとならず終了コードも0となる。

また、呼び出し方としてシンボリック・リンクが問題となっているかを確認するために、適当な名前で新規にシンボリック・リンクを作成した結果、パスとしてviとなっている場合のみ終了コードが1になってしまう事が分った。

$ cat .vimrc

filetype off

$ sudo ln -s /usr/bin/vim /usr/bin/aaa
$ /usr/bin/aaa code.rb
$ echo $?
0
$ sudo mv /usr/bin/aaa /usr/bin/vi
$ /usr/bin/vi code.rb
$ echo $?
1

Homebrewでインストールしたvimではどうなるかというと、ログ上では同じエラーが発生しているが、終了コードには影響しない。ついでにUbuntu 14.04上でも試してみたが終了コードは0である。

…OS Xに初期状態でインストールされている Vim version 7.3固有の問題のようですが、もうVim version 7.4を使用するのでここまで。