vi/fugitive: Gpush 不退出...有时

vi/fugitive: Gpush does not exit... sometimes

我刚开始在我的工作流程中使用 fugitive...非常有用!但我似乎 运行 陷入了一种奇怪的烦恼,我希望有人可以解决以下问题:

当我 运行 :Gpush 时,有时无法控制 returns 到 vi。 Vi 挂在 git push 的输出上,直到我按 Ctrl+C 杀死 "it"。我也试过安装 vim-dispatch and, within tmux,结果是 git push 窗格永远不会关闭。这更烦人,因为我必须切换到该窗格以使用 Ctrl+C。

奇怪的是,如果我 ps,我没有看到任何 git 进程 运行ning,所以我不确定到底是什么挂起...但是 Ctrl+ C 会杀死 "it",无论 "it" 是什么,并将 returns 控制到 vi.

我发现 closed github issue 提到了类似的行为,但从未发布过解决方案...看来问题最终只是针对 OP "went away",因此问题已关闭。

然而,一段时间后第二个人回复了这个问题,说他遇到了类似的问题,而且似乎是在 git 产生某种 "credential cache daemon" 时发生的。我没有像他那样使用凭证助手,所以这不是我的确切问题......但这让我注意到了其他事情:

我将 ssh 配置为保持连接打开 5 分钟(ControlPersist 5m 在我的 ~/.ssh/config 中)。如果我有一段时间没有推送,git push 会导致 ssh 生成一个进程来保持连接。这触发了问题。 5 分钟后,ssh 退出,这将解决问题并导致 tmux 窗格关闭。如果我在连接仍处于打开状态时再次推送,它会正常工作。

所以,问题似乎出在 git 产生另一个进程的时候。当我在命令行上 运行 git 时,这显然不会引起任何问题,那么为什么它会在这里引起问题?我能做些什么呢?我不想禁用 ssh 持久连接,因为它很有用...

对于将来偶然发现此问题的任何人,我已经针对我的 ssh 进程挂起的特殊情况提出了解决方案 vim:我禁用了 ControlPersist 选项,但仅针对 git 命令 运行 inside vim via fugitive 通过在我的 .vimrc:

中设置以下选项
let g:fugitive_git_executable = "env GIT_SSH_COMMAND='ssh -o ControlPersist=no' git"

这很丑陋,我很难过我必须禁用持久连接,但它有效。