Git Bash卡在差异/日志上,一遍又一遍地自发地重复相同的命令

时间:2011-09-29 14:40:19

标签: git git-bash

我在Windows 7 / XP上遇到Git Bash的奇怪问题。它曾经工作正常,但最近我发现在执行git diffgit log后,Git Bash变得无法使用:在diff / log之后,即使在我返回命令提示符后,Bash突然停止并且显然是自发地重复相同的命令,没有提示,而我正在键入后续命令。

还有其他人有这个问题吗?任何建议都会非常感激,因为这实际上限制了Git Bash目前的实用性。

2 个答案:

答案 0 :(得分:53)

您必须使用q退出git的寻呼机。使用Ctrl-C只会导致窗口出现问题。

Ctrl-C不应该​​退出寻呼机(它不在Linux系统上)。当你在Windows上使用Ctrl-C时(msysgit,我想?),你以某种方式“从外部”(即从cmd.exe)杀死进程。我不知道发生这种情况的确切原因。

由于我过去经历过类似的问题:尝试按随机顺序重复按q和Ctrl-C,如果你很幸运,你会再次得到工作提示;)[没有我知道的更好的解决方案 - 但它对我有用......]

答案 1 :(得分:2)

请注意,使用Git 2.12(2017年第1季度,6年以后),git寻呼机会话中的 Ctrl + C 应该会表现得更好。

commit 46df690commit 246f0edcommit 2b296c9Jeff King (peff)(2017年1月7日)。
(由Junio C Hamano -- gitster --合并于commit 5918bdc,2017年1月18日)

  

execv_dashed_external:等待孩子信号死亡

     

^C键入pager,通常不会杀死它,杀死Git并将寻呼机作为特定进程树结构中的附带损坏。   这已得到修复。

您可以使用git -p stash list之类的命令运行任何虚线外部,命令完成运行,但寻呼机仍在运行。

简短版本是一切都应该正常停止(Git和寻呼机)

但详细说明:

  

git运行pager时,git进程非常重要   闲逛并等待pager完成,即使它   没有更多的数据来喂它   这是因为git生成pager作为孩子,因此git进程是终端上的会话负责人。它死后,pager将完成从终端的当前读取(吃掉它   字符),然后让EIO再次尝试阅读。

注意:EIO(错误5)错误I / O的tands,并且是(source):

  

捕获各种意外的硬件错误。它可能来自物理错误,但另外,尝试从标准输入读取的孤立进程(父进程已经死亡的进程)将获得此错误。如果您尝试打开已在使用的pty设备,BSD系统将返回此信息   尝试从已关闭的流中读取将返回EIO,磁盘读取或写入也将返回到设备的物理边界之外。
  当进程没有控制tty时,/dev/tty打开也会回吐EIO

所以(回到^C中的pager):

  

当您点击^C时,会将SIGINT发送到gitpager,   这是一种类似的情况   pager忽略它,但git进程需要在寻呼机完成之前一直闲置。我们很久以前就在a3da882 (pager: do wait_for_pager on signal death, 2009-01-22)中解决了这个问题。

     

但是当你有一个虚线外部(或者一个指向内置的别名,它将重新执行内置的git)时,混合中会有一个额外的过程。
  例如,运行:

$ git -c alias.l=log l
  

最终会得到一个过程树,如:

  git (parent)
    \
     git-log (child)
      \
       less (pager)
  

如果您点击^CSIGINT会全部转到class A { public: virtual bool operator==(const A& a); }; class B : public A { public: bool operator==(const B& b) { ... } }; 。寻呼机忽略它,子git进程将以wait_for_pager()结束。
  但是父母git进程将会死亡,并且通常会发生EIO问题。