我在Windows 7 / XP上遇到Git Bash的奇怪问题。它曾经工作正常,但最近我发现在执行git diff
或git log
后,Git Bash变得无法使用:在diff / log之后,即使在我返回命令提示符后,Bash突然停止并且显然是自发地重复相同的命令,没有提示,而我正在键入后续命令。
还有其他人有这个问题吗?任何建议都会非常感激,因为这实际上限制了Git Bash目前的实用性。
答案 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 46df690见commit 246f0ed,commit 2b296c9,Jeff 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
发送到git
和pager
, 这是一种类似的情况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)
如果您点击
^C
,SIGINT
会全部转到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问题。