Git Bash卡在diff / log上,自发地重复同样的命令
我在Windows 7 / XP上遇到了Git Bash的一个奇怪的问题。 它曾经工作得很好,但最近我发现,在我执行git diff
或git log
,Git Bash变得不可用:在diff / log之后,即使在我返回到命令提示符后,Bash仍然突然显然自发地重复命令,自由的,而我正在键入一个后续的命令。
有没有其他人有这个问题? 任何意见将不胜感激,因为这是真正限制Git Bash的有用性在这一刻。
你必须使用q
来退出git的寻呼机。 使用Ctrl-C只会导致在Windows上的问题。
Ctrl-C不应该退出寻呼机(而不是在Linux系统上)。 当你在Windows上按Ctrl-C(我猜想是msysgit)时,你会以某种方式“从外部”(即从cmd.exe)杀死进程。 我不知道这种情况发生的确切原因。
正如我以前遇到类似的问题:尝试按顺序重复q
和Ctrl-C,如果幸运的话,你会得到一个工作提示;)[我没有更好的解决scheme – 但它为我工作…]
请注意,使用Git 2.12(2017年第一季度,6年以上),在git分页器会话中的Ctrl + C应该performance得更好。
参见Jeff King( peff
)的 提交46df690 , 提交246f0ed , 提交2b296c9 (2017年1月7日) 。
(由Junio C gitster
合并- gitster
-在承诺5918bdc ,2017年1月18日)
execv_dashed_external
:等待信号死亡的孩子打字
^C
pager
,通常不会杀死它,杀死Git并把寻呼机作为一个附带的损害在某些过程树结构。
这已被修复。
你可以使用像git -p stash list
这样的命令运行任何虚拟的外部命令,其中命令完成运行,但是寻呼机仍然在运行。
简短的版本是一切应该正常停止(Git和传呼机)
但详细地说:
当
git
运行一个pager
,重要的是让git进程停下来等待pager
完成,尽pipe它没有更多的数据来提供它。
这是因为git
会把pager
当成孩子,所以git
进程就是terminal上的会话负责人。 它死后,pager
将完成从terminal(吃一个字符)的当前读取,然后让EIO
尝试再次读取。
注意: EIO
(错误5)tands为错误I / O,并且是( 源 ):
所有方式的意想不到的硬件错误的catchall。 这可能来自一个物理错误,但另外,一个孤立的进程(一个父进程已经死亡)试图从标准input读取将得到这个。 如果您尝试打开一个已经使用的pty设备,BSD系统会返回这个信息。
尝试从已closures的stream中读取将返回EIO,如同读取或写入的磁盘不在设备的物理边界之内。
当进程没有控制tty时打开/dev/tty
tty也会吐出EIO
。
所以(回到pager
^C
):
当你点击
^C
时,发送SIGINT
到git
和pager
,这也是类似的情况。
pager
忽略它,但git
过程需要四处走动,直到寻呼机完成。 我们很久以前就在a3da882(寻呼机:wait_for_pager on signal death,2009-01-22) 。但是当你有一个外部虚线(或一个别名指向一个内build的,这将内置的重新执行git),混合中有一个额外的过程。
例如,运行:
$ git -c alias.l=log l
最终会得到一个进程树,如:
git (parent) \ git-log (child) \ less (pager)
如果你击中
^C
,SIGINT
去所有的人。 传呼机忽略它,子git进程将在wait_for_pager()结束。
但是,父Git进程将会死亡,而通常的EIO问题会发生。