7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-11-01

#検証環境
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を使用するのでここまで。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?