Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
windows XP上的Git sh.exe进程分叉问题,速度慢?_Git_Bash_Shell_Windows Xp_Msysgit - Fatal编程技术网

windows XP上的Git sh.exe进程分叉问题,速度慢?

windows XP上的Git sh.exe进程分叉问题,速度慢?,git,bash,shell,windows-xp,msysgit,Git,Bash,Shell,Windows Xp,Msysgit,Git对我的工作流程至关重要。我在我的四核机器上用3GB内存在WindowsXP上运行MSYSGit,通常它响应迅速 突然出现了一个问题,从gitbash命令提示符运行任何命令都需要>30秒,包括ls或cd。有趣的是,从bash提示符来看,它看起来像是ls运行得相当快,然后我可以看到ls的输出,但是提示符返回大约需要30秒。如果我切换到windows命令提示符(通过从“开始”菜单运行cmd),git相关的命令也会花费很长时间,即使只是运行。例如,git status可能需要将近一分钟的时间才能发

Git对我的工作流程至关重要。我在我的四核机器上用3GB内存在WindowsXP上运行MSYSGit,通常它响应迅速

突然出现了一个问题,从gitbash命令提示符运行任何命令都需要>30秒,包括
ls
cd
。有趣的是,从bash提示符来看,它看起来像是
ls
运行得相当快,然后我可以看到
ls
的输出,但是提示符返回大约需要30秒。如果我切换到windows命令提示符(通过从“开始”菜单运行
cmd
),git相关的命令也会花费很长时间,即使只是运行。例如,
git status
可能需要将近一分钟的时间才能发生任何事情。有时这些过程根本就没有完成

请注意,我已经安装了“MSYS Git”以及用于
MinGW
make
之类的常规“MSYS”

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

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

如果我在<代码> L/<代码>的中间出现代码> CTRL C <代码>,我有时会得到一些错误,其中包括:

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
我可以修复这个问题以使git再次快速运行吗?如果可以,如何修复

我尝试过的事情:

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

我很想不擦我的盒子,重新安装Windows,但如果我不能修复这个问题,我会的。如果运行
git status
cd需要30秒以上的时间,我就不能再编写代码了。

通常,当一个程序需要30秒来完成一些应该是即时的事情时,更可能是I/O超时问题,通常是网络问题,而不是CPU的速度或RAM的数量。您可能想知道网络是如何涉及的,但这是一个合理的问题(我也不知道您的系统)

Msysgit安装一个特殊的提示符,运行一个特殊的函数
\uu git\u ps1
,在提示符中显示一些有用的信息。您可以使用echo$PS1查看此信息,对于我的系统,此信息显示:

$ echo $PS1
\[\033]0;$MSYSTEM:\w\007 \033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\] $
此额外信息是完全可选的,您可以将其关闭。因此,请在Msysgit窗口中尝试以下操作:

$ PS1='$ '
$
这会将提示重置为默认的
$
,而不会尝试在提示内运行和命令。如果这解决了延迟问题,那么很可能是
\uu git\u ps1
函数。尝试手动运行它:

$ __git_ps1
 (master)
看看需要多长时间才能回来

您可以通过从
C:\Program Files\git\etc\profile
中删除调用
\u git\u ps1
的行来修复此问题:

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

虽然格雷格的回答解决了眼前的速度问题,但我觉得这只是掩盖了问题,而不是解决问题

我开始让git bash缓慢运行,按照Greg描述的步骤,我确实确定了肇事者是
\ugit\ups1

我没有修改命令提示符信息(我发现它显示的信息很有用),而是找到了一个适合我的解决方案,在一篇博客文章中描述:

搜索一下互联网,我发现git使用默认的home, 在我的帐户上设置为网络帐户。这是git将要做的承诺 一直查看此目录,导致延迟

为了解决这个问题,我创建了一个本地用户环境变量,覆盖 默认值,并将其设置为%USERPROFILE%,指向 c:\users[用户名]

同样的解决方案也发布在SO上


添加环境变量使git恢复全速运行,我仍然可以获得命令行信息。

如果在同时运行多个git命令时发现速度减慢,则可能是由于msysgit中的内核锁定问题造成的

我们看到,在某些情况下,git.exe的多个实例都会在同一个内核对象上等待(在
WaitForSingleObject()
中),这实际上意味着一次只能在系统上运行一个git命令

请看这里:

使用ProcessExplorer,我们可以看到所有git.exe进程都卡在这里:

ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
ntoskrnl.exe!KeWaitForMutexObject+0x19f
ntoskrnl.exe!FsRtlCancellableWaitForMultipleObjects+0x5e
ntoskrnl.exe!FsRtlCancellableWaitForSingleObject+0x27 
这似乎与这个问题有关:不是Git而是伪Linux运行时(mingw),它似乎包含了这个问题

我们将用于从系统运行应用程序的用户帐户更改为交互式用户帐户,内核对象等待消失:

正常的git.exe进程

因此,您所看到的减速可能与某种内核对象争用有关——只有当前面的git命令释放了内核锁时,其他命令才能运行


尝试更改运行git命令所使用的用户帐户,看看这是否解决了问题—我们确实解决了。

我在Windows XP机器上遇到了缓慢的进程分叉问题。有时,一个进程分叉需要几分钟的时间


我的解决办法是清空计算机的临时文件夹。计算机是一种共享资源,多年来一直在其中积累文件。

因此我们也遇到了这个问题,我认为我们最终将其追溯到msys对Windows安全模型的实现。我将尝试发布该问题的简短摘要:

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

这就是sh.exe被阻止30秒时发生的情况。因此,
NetServerEnum()
只在
msys
中的一个地方调用,即
ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
ntoskrnl.exe!KeWaitForMutexObject+0x19f
ntoskrnl.exe!FsRtlCancellableWaitForMultipleObjects+0x5e
ntoskrnl.exe!FsRtlCancellableWaitForSingleObject+0x27