git提交命令无限挂起

19
当我尝试使用git commit提交时,sublime文本编辑器打开了,我编写了提交信息并保存关闭了编辑器,但更改没有被提交。终端卡在了git commit上。
我在网上搜索到一个有同样问题的人,并应用了相同的修复方法,没有考虑任何事情。我运行了以下命令:
git config --global core.editor "mate -w" 

现在我运行 git commit 时出现了一个新错误:

mate -w: 1: mate -w: mate: not found error: 编辑器 'mate -w' 出现问题。 请使用 -m 或 -F 选项提供提交信息。

求助。我对 Git 和使用 Ubuntu 14.04 非常陌生。


git commit -m "commit message" 可以工作吗?是的?那你的编辑器可能有问题。 - nalinc
1
相关的:http://stackoverflow.com/questions/26223074/git-doesnt-auto-commit-when-i-pull - jub0bs
@NLN- 是的,它确实起作用了。你能帮我解决这个问题吗?我该怎么做? - user2715898
你是真的关闭了编辑器,还是只是暂停了它(使用Ctrl-Z)? - Thorbjørn Ravn Andersen
2
@ThorbjørnRavnAndersen- 我保存内容后关闭了编辑器(ctrl+q)。 - user2715898
1
好的!所以我运行了 git config --global core.editor "subl -n -w" 命令,现在一切都正常了。谢谢大家。 :) - user2715898
5个回答

14
Git 在提交时会运行很多外部程序。虽然 Git 本身不太可能挂起,但它调用的任何外部程序都可能挂起,所以按执行顺序:
  1. pre-commit 钩子。这是一个位于 $REPO_ROOT/.git/hooks/pre-commit 的脚本(不是 .sample 文件!它必须是一个被命名为 pre-commit 的文件)。检查脚本的内容是否会出现挂起。
  2. prepare-commit-msg 钩子。这个钩子就在 pre-commit 钩子旁边,像你预期的那样命名。同样需要检查。
  3. 如果你没有传递 -m 参数,则启动编辑器让你输入消息。确保:
    • 窗口没有被隐藏(超出屏幕、最小化或在其他窗口后面)
    • 编辑器本身没有挂起
  4. commit-msg 钩子。和其他钩子一样。
  5. 提交签名。仅当指定了 -S 参数时才运行此步骤,或者如果你设置了 commit.gpgsign = true。可以使用 git config commit.gpgsign 命令检查后者。这也依赖于你的 GPG 代理。检查:
    • 如果你的代理使用 GUI 获取你的密码,则窗口没有被隐藏,就像编辑器一样。
    • 代理本身没有挂起。我遇到过几个问题,我的代理是基于 curses 的。
    • 你可以随时杀死你的 GPG 代理。它只是暂时保存你的密码,所以你不需要每次都输入密码。当你再次执行 git commit 时,它将重新启动;这可能会或可能不会帮助你解决挂起的问题。
  6. post-commit 钩子。

请注意,上面只讨论了手动创建提交的情况。merge 也会创建提交,并且遵循大体相同的顺序,但具有一些不同的钩子

此外,如果你的仓库特别大,Git 本身也可能需要一些时间——每个提交实际上是给定时间所有文件的快照。如果你明智地使用 .gitignore 来忽略一些内置可执行文件,仅仅跟踪 Git 仓库中的源代码,它会有所帮助。注意,这可能会破坏某些编辑器:Visual Studio(原版,而不是 VS Code)特别容易出现这种问题。


4
我曾经在 gpg 签名 curses 提示符中按下了 Ctrl-D,之后我不得不杀死 gpg-agent 进程才能让 git commit 再次工作。 - Kamil
只想强调@Waked的评论。还有一个gpg代理更新过程似乎也卡住了。对我来说,问题是在从vscode内发起提交时开始的,它没有将gpg auth shell带到前台。我相信它超时了,这似乎触发了卡顿。 - ballenf

10

对我来说,这是一次GPG签名会话突然退出,我不得不使用命令杀死了GPG会话。

gpgconf --kill gpg-agent

我不认为这回答了问题,但它确实帮助我解决了我的问题。 - Dave

9

可能你有一个执行耗时任务的提交前钩子。

检查 .git/hooks/pre-commit 并查看它所做的事情。


2
此外,您可以使用 git commit --no-verify 跳过 pre-commit 钩子,以确定是 pre-commit 钩子阻止了 git 继续进行。 - devsnd

3

git commit无限挂起也可能是因为您使用gpg签署提交并且gpg-agent 配置不正确或存在其他问题。

在使用hidepid设置的强化系统中,在~/.gnupg/gpg-agent.conf中设置pinentry-program /usr/bin/pinentry(当前默认为gtk2 pinentry对话框)可以解决与tty对话框相关的问题。

~/.gitconfig中使用nano作为编辑器比使用桌面编辑器要少出现很多问题:

[core]
        editor = nano
        pager = less -FXRS

1
这对我来说是个问题,gpg正在等待锁。 rm ~/.gnupg/gnupg_spawn_agent_sentinel.lock 解决了这个问题。 - Olivier Tassinari

2

我使用Sublime来提交我的代码,但是我发现问题在于一个Sublime的窗口打开了,但没有出现在前台(通常情况下会出现)。解决方案很简单,但因为它不像平时那样工作,所以看起来好像卡住了。


这似乎没有回答问题。在我看来,这应该是一条评论。 - Mickael
1
可能不是针对此特定用户的问题,但这是谷歌搜索“git commit hangs”的热门问题,看起来编辑器在这种情况下是一个常见的问题 - 希望它能帮助到某些人。 - user2891659

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