Git: восстановить сообщение об ошибке

Время от времени, так как я добросовестно создаю сообщение nice, описательное сообщение, я получаю сообщение об ошибке:

".git/COMMIT_EDITMSG" 81L, 2108C written
error: There was a problem with the editor 'vim'.
Please supply the message using either -m or -F option.

Обратите внимание, что это обычно после :wq. Я проверяю файл .git/COMMIT_EDITMSG, и он не имеет никаких изменений. Есть ли другое место, которое git сохраняет это сообщение, чтобы я мог его восстановить и повторить попытку? Имеют ли люди опыт этой проблемы и знают, почему это может произойти со мной? У меня нет проблем с записью в другие файлы, и разрешения, похоже, в порядке.

Ответы

Ответ 1

Не уверен, насколько git на COMMIT_EDITMSG, когда вы находитесь в этом состоянии. Как упоминалось ранее, вы можете увидеть, удалось ли vim сохранить его. Но я понимаю, что vim default - это удаление резервной копии, если вы явно не сказали, чтобы она хранила их. Кроме того, если вы не хотите, чтобы эти файлы были разбросаны по всем вашим каталогам, вы можете указать каталог для их размещения (вам, возможно, придется вручную создать каталог в первую очередь).

Попробуйте добавить следующие две строки в файл ~/.vimrc:

 backup
 backupdir=~/.vim/backup

Вручную создайте каталог ~/.vim/backup, затем отредактируйте файл и выйдите из него. Вы должны увидеть копию файла с "~" в конце имени в вашем резервном каталоге.

На стороне примечания, если вы так ленивы, как я, используйте ": x" для выхода из vim вместо ": wq". ": X" выполняет как запись, так и выход.

Ответ 2

Я смог решить эту проблему, комбинируя различные решения и используя только git (без зависимости от vim или его конфигурации).

В моем случае я также использую репозиторий с подмодулями, что делает его немного другим:

Вместо .git/.COMMIT_EDITMSG Сообщение хранится в .git/modules/{REPO}/COMMIT_EDITMSG

К счастью, мы можем использовать git rev-parse --git-dir, чтобы сказать нам это.

И мы можем использовать git commit -eF [FILE], чтобы взять сообщение коммита из файла (-F) и отредактировать сообщение (-e).

Все вместе:

git commit -eF $(git rev-parse --git-dir)/COMMIT_EDITMSG

Поскольку это слишком долго, мы также можем определить псевдоним

git config --global alias.recommit '!git commit -eF $(git rev-parse --git-dir)/COMMIT_EDITMSG'

Чтобы мы могли назвать это так:

git recommit [... other commit arguments]