Git:恢复失败的提交消息

29

每隔一段时间,当我认真地编写一个有意义的、描述性的提交信息时,我会遇到一个错误:

".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 是否有另一个地方保存此消息,以便我可以恢复它并尝试提交?有人遇到过这个问题并知道为什么会发生在我身上吗?我没有写其他文件的问题,权限似乎也没问题。


你尝试过查找vim的备份文件吗? - freitass
1
那会是.git/.COMMIT_EDITMSG.swp文件吗?嗯,看来没戏了。 - devoid
7
我无法恢复提交信息,但我知道你为什么会收到错误提示。我在工作的 Mac 上看到这种行为,但在家里的 Linux 上没有出现过。如果我不小心在保存提交信息时输入了“:Wq”,然后再回去输入“:wq”,提交将失败。 - haydenmuhl
3
有时候,当我尝试用Git签署提交时(默认使用git commit -S),如果我的USB密钥没有插入,会出现这种情况。在这种情况下,.git/COMMIT_EDITMSG是存在的,你可以在那里检索到消息。但我不确定为什么在我插入密钥并再次尝试使用git commit -S后,它不会自动恢复到vim中去。 - jwir3
1
正如@haydenmuhl所提到的,应该归咎于:Wq。按照这个SO答案中解释的设置git config --global core.editor vim -f可以解决这个问题。 - Amir Nissim
3个回答

17

通过结合不同的解决方案并仅使用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]

1
优秀的回答! - theutz
1
完美!这应该是正确的答案。 - Nuno Silva

8
在这种状态下,不确定在COMMIT_EDITMSG上使用git。如前所述,您可以查看vim是否保存了它。但是我的理解是vim的默认设置是删除备份,除非您明确告诉它保留备份。此外,如果您不想在目录中散布这些文件,您可以指定一个目录来放置它们(您可能需要手动创建该目录)。
尝试将以下两行添加到您的~/.vimrc文件中:
 backup
 backupdir=~/.vim/backup

手动创建~/.vim/backup目录,然后编辑文件并退出。你应该在备份目录中看到一个带有“~”结尾的文件副本。
顺便说一句,如果你和我一样懒,可以使用“:x”退出vim,而不是“:wq”。 “:x”既写入又退出。

4
“ZZ”比“:x<CR>”更好。 - Geoff Reedy
2
1: E492:不是编辑器命令:备份 行 2: E492:不是编辑器命令:备份目录=~/.vim/backup - Chucky

0
我有一个同事遇到了同样的问题。也许楼主在打字。
:Wq

不是

:wq

我建议使用退出。
:x

为了避免这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接