在Windows XP上Git sh.exe进程分叉问题,慢?

And*_*dyL 8 git bash shell windows-xp msysgit

Git对我的工作流程至关重要.我在带有3GB内存的四核机器上运行Windows XP上的MSYS Git,通常它具有响应性和灵活性.

突然出现一个问题,从Git Bash命令提示符运行任何命令需要> 30秒,包括lscd.有趣的是,从bash提示看起来喜欢ls运行得相当快,然后我可以看到输出ls,但是然后返回提示需要大约30秒.如果我切换到Windows命令提示符(通过cmd从开始菜单运行)git相关命令也需要永远,甚至只是运行.例如git status,在发生任何事情之前可能需要将近一分钟.有时这些过程根本无法完成.

请注意,我有"MSYS的Git"安装以及定期的"MSYS"对于喜欢的东西MinGWmake.

我认为问题与sh.exe位于C:\Program Files\Git\bin.当我ls从bash提示符运行时,或者当我git从Windows提示符调用时,任务管理器最多显示四个sh.exe进程的进程实例.

在这里,我等待ls返回,你可以看到任务管理器已经git.exe运行了四个实例sh.exe: 在这里,我等待ls返回,你可以看到任务管理器运行git.exe和sh.exe的四个实例

如果我ctrl-c在中间,ls我有时会得到包括以下内容的错误:

sh.exe": fork: Resource temporarily unavailable
      0 [main] sh.exe" 1624 proc_subproc: Couldn't duplicate my handle<0x6FC> fo
r pid 6052, Win32 error 5
sh.exe": fork: Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)

或者git status:for :git status

sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)

我可以解决这个问题,以便git再次快速运行,如果是这样,怎么办?

我尝试过的事情:

  • 重启
  • 将MSYS Git升级到最新版本并重新启动
  • 将MSYS升级到最新版本并重新启动
  • 卸载MSYS并卸载并重新安装MSYS Git并重新启动

我非常想不擦拭我的盒子并重新安装Windows,但如果我不能解决这个问题,我会的.我不能再代码,如果需要我> 30秒运行git statuscd.

Gre*_*ill 7

通常当一个程序需要30秒才能做一些应该是瞬时的事情时,它更可能是I/O超时问题,通常是网络,而不是你的CPU速度或你拥有的RAM量.您可能想知道网络是如何参与的,但这是一个合理的问题(我也不知道您的系统).

Msysgit安装一个特殊的提示符,它运行一个特殊的函数__git_ps1,在提示符中显示一些有用的信息.您可以看到这个使用echo $PS1,对于我的系统,这显示:

$ echo $PS1
\[\033]0;$MSYSTEM:\w\007 \033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\] $
Run Code Online (Sandbox Code Playgroud)

这些额外信息是完全可选的,您可以将其关闭.因此,在Msysgit窗口中尝试以下操作:

$ PS1='$ '
$
Run Code Online (Sandbox Code Playgroud)

这会将提示重置为默认值,$而不是尝试在提示符内运行和命令.如果这解决了你的延迟问题,那么很可能就是这个__git_ps1功能.尝试手动运行:

$ __git_ps1
 (master)
Run Code Online (Sandbox Code Playgroud)

并看看返回需要多长时间.

您可以通过删除__git_ps1从中调用的行来解决此问题C:\Program Files\Git\etc\profile:

#Comment the lines below
#PS1='\[\033]0;$MSYSTEM:\w\007
#\033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\]
#$ '
Run Code Online (Sandbox Code Playgroud)

  • 好!我对你的答案进行了编辑,说明你可以通过在`C:\ Program Files\Git\etc\profile`中注释掉相应的行来解决问题.非常感谢你.巨大的帮助. (2认同)

use*_*699 7

所以我们也遇到了这个问题,我想我们最终将其追溯到msys的Windows安全模型的实现.我将尝试发布该问题的简短摘要:

截图: 堆栈的卡住sh.exe的痕迹.注意当msys-1.0.dll调用NetServerEnum()时

这是当sh.exe被阻止30秒时发生的事情.因此NetServerEnum()msys在一个地方调用,security.cc:228 in get_lsa_srv_inf(),由get_logon_server()and 调用,get_logon_server_and_user_domain()调用in create_token(),由seteuid()syscalls.cc调用,调用方式为setuid().

因此,最初发生的是当msys DLL初始化并且sh.exe试图调用时setuid(),msys尝试忠实地遵守Windows安全模型并尝试从您的域/工作组中查找域服务器列表.不幸的是,与Linux不同,对于Windows来说,这是一个阻塞调用,需要5到30秒才能完成/超时,而实际上git是不必要的.

我们的解决方案是创建一个安全的"功能"通过设置禁用新msys.dll has_security在winsup.cc为false.msysgit附带的bash/sh.exe与我们新版本的msys.dll不兼容,所以我们不得不从头开始编译一个新的bash.exe,不明白为什么.最终结果是sh.exe不再尝试进行这些NetServerEnum调用并运行lickity split.